Как удалить файл из репозитория git?


я добавил файл с именем "file1.txt" в Git РЕПО. После этого я совершил его, добавил пару каталогов под названием dir1 и dir2, и передал их в Git repo.

теперь у текущего РЕПО есть "file1.txt",dir1 и dir2.
Как я могу удалить "file1.txt" не затрагивая других, как dir1 и dir2?

17 1381

17 ответов:

использовать git rm:

git rm file1.txt
git commit -m "remove file1.txt"

но если вы хотите удалить файл только из репозитория Git и не удалять его из файловой системы, используйте:

git rm --cached file1.txt
git commit -m "remove file1.txt"

и нажать изменения в удаленном РЕПО

git push origin branch_name  

git rm file.txt удаляет файл из РЕПО, но также удаляет его из локальной файловой системы.

чтобы удалить файл из РЕПО и не удалить его из локальной файловой системы используйте:
git rm --cached file.txt

ниже точная ситуация, когда я использую git для поддержания контроля версий для веб-сайта моего бизнеса, но каталог "Микки" был папкой tmp для совместного использования частного контента с разработчиком САПР. Когда ему нужны были огромные файлы, я сделал частный, несвязанный каталог и ftpd файлы там для него, чтобы получить через браузер. Забыв, что я сделал это, я позже выполнил git add -A из базового каталога сайта. Впоследствии,git status показал новые файлы, нуждающиеся в фиксации. Теперь мне нужно было удалить их из отслеживания и контроля версий git...

пример вывода ниже от того, что только что произошло со мной, где я непреднамеренно удалил . К счастью, мне все равно, что случилось с локальной копией .003, но некоторые из других измененных в настоящее время файлов были обновлениями, которые я только что сделал на веб-сайте, и было бы эпично удалить в локальной файловой системе! "Локальная файловая система" = живой сайт (не большая практика, но это реальность).

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

обновление: этот ответ получает некоторый трафик, поэтому я подумал, что упомяну мой другой Git ответ разделяет несколько больших ресурсов:на этой странице есть графика, которая помогает прояснение Git для меня. Элемент книга"Pro Git" онлайн и мне очень помогает.

Если ваш файл уже находится на GitHub,вы сейчас (июль 2013) можете непосредственно удалить его из веб-интерфейса!

просто просмотрите любой файл в своем репозитории, нажмите значок корзины вверху и зафиксируйте удаление, как и любое другое веб-редактирование.

delete button

(фиксация будет отражать удаление этого файла):

commit a deletion

и просто так, он ушел.

для помощи с этими функциями, не забудьте прочитать наши статьи справки на создание,двигаясь,переименовать и удаление файлы.

Примечание: так как это система управления версиями, Git всегда имеет вашу спину, если вам нужно восстановить файл позже.

последнее предложение означает, что удаленный файл все еще является частью истории, и вы можете восстановить его достаточно легко (но еще не через веб-сайт GitHub интерфейс):

в разделе "восстановить удаленный файл в Git repo".

Это единственный вариант, который работал для меня.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Примечание: Замените *.sql с вашим именем файла или типом файла. Будьте очень осторожны, потому что это будет проходить через каждую фиксацию и вырвать этот тип файла.

кроме того, если это папка для удаления и последующие дочерние папки или файлы, используйте:

git rm -r foldername

в целом, git help поможет хотя бы с простыми вопросами вроде этого:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

Если вы хотите удалить файл из РЕПО, но оставить его в файловой системе (не будет отслеживаться):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Если вы хотите удалить файл из репозитория и из файловой системы, то есть два варианта:

  1. Если файл не имеет изменений в индексе:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Если файл имеет изменения, размещенные в индексе:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

git rm будет только удалить файл на этой ветке с этого момента, но он остается в истории, и git будет помнить его.

правильный способ сделать это с git filter-branch, Как уже упоминалось здесь. Он перепишет каждую фиксацию в истории ветви, чтобы удалить этот файл.

но даже после этого git может запомнить его, потому что могут быть ссылки на него в reflog, remotes, тегах и т. д.

если вы хотите полностью уничтожить его в один шаг, я рекомендую вам использовать git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

это легко, просто сделать git forget-blob file1.txt.

это удалит все ссылки, do git filter-branch, и, наконец, запустите сборщик мусора git git gc чтобы полностью избавиться от этого файла в репозитории.

другой способ, если вы хотите удалить файл из локальной папки с помощью команды rm, а затем нажмите изменения на удаленный сервер.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

для удаления конкретного файла

git rm filename

чтобы очистить все неотслеженные файлы из каталога рекурсивно в одном кадре

git clean-fdx

Если у вас есть приложение GitHub для Windows, вы можете удалить файл в 5 простых шагов:

  • Нажмите Кнопку Синхронизации.
  • нажмите на каталог, в котором находится файл, и выберите последнюю версию файла.
  • нажмите на инструменты и выберите " Открыть оболочку здесь."
  • в оболочке введите: "rm {filename}" и нажмите enter.
  • зафиксируйте изменение и повторную синхронизацию.

в моем случае я попытался удалить файл на github после нескольких коммитов, но сохранить на компьютере

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

и потом этот файл был проигнорирован

  1. Сначала удалите файлы из локального репозитория.

    git rm-r File-Name

    или удалить файлы только из локального репозитория, но из файловой системы

    git rm --cached File-Name

  2. во-вторых, зафиксировать изменения в локальном репозитории.

    git commit -m "unwanted files or some inline comments"   
    
  3. наконец, обновите / нажмите локальные изменения в удаленном репозитории.

    git push 
    

Я пробовал много предложенных вариантов, и ни один из них не работал (я не буду перечислять различные проблемы). То, что я в конечном итоге сделал, что сработало, было простым и интуитивно понятным (для меня):

  1. переместить все локальное РЕПО в другое место
  2. клонировать РЕПО снова от мастера к локальному диску
  3. скопируйте файлы / папки из исходной копии в #1 обратно в новый клон из #2
  4. убедитесь, что проблема большого файла либо нет или исключен в составе .gitignore file
  5. сделайте обычный git add / git commit / git push

у меня есть файлы obj и bin, которые случайно попали в репо, что я не хочу загрязнять свой список "измененных файлов"

после я заметил, что они пошли на пульт, я проигнорировал их, добавив это в .gitignore

/*/obj
/*/bin

проблема в том, что они уже находятся в удаленном режиме, и когда они меняются, они появляются как измененные и загрязняют список измененных файлов.

чтобы перестать видеть их, нужно удалить всю папку с пульта хранилище.

в командной строке:

  1. CD в папку РЕПО (т. е. C:\repos\MyRepo)
  2. Я хочу удалить SSIS\obj. Кажется, вы можете удалить только на верхнем уровне, поэтому теперь вам нужно CD в SSIS: (т. е. C:\repos\MyRepo\SSIS)
  3. теперь введите магическое заклинание git rm -r -f obj
    • rm=удалить
    • -Р = рекурсивно удалить
    • - f = означает силу, потому что вы действительно имеете в виду это
    • obj является папка
  4. теперь бегите git commit -m "remove obj folder"

я получил тревожное сообщение:13 файлов изменены 315222 удаления

затем, поскольку я не хотел искать строку CMD, я вошел в Visual Sstudio и сделал синхронизацию, чтобы применить ее к удаленному

после удаления файла из РЕПО с помощью git rm можно использовать BFG Repo-Cleaner полностью и легко стереть файл из истории РЕПО.

Если вы не храните файл в своем локальном РЕПО, но в Git repo, то просто откройте файл в Git repo через веб-интерфейс и найдите кнопку удаления в правом углу интерфейса. Нажмите здесь, чтобы просмотреть опцию удаления интерфейса