Как я могу удалить файл из git repo? - PullRequest
1660 голосов
/ 12 января 2010

Я добавил файл с именем "file1.txt" в git repo.После этого я добавил его, добавил пару каталогов с именами dir1 и dir2 и передал их в git repo.

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

Ответы [ 18 ]

2759 голосов
/ 12 января 2010

Использование 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  
579 голосов
/ 26 мая 2013

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

Чтобы удалить файл из репозитория, а , а не , удалить его из локальной файловой системы, используйте:
git rm --cached file.txt

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

Ниже приведен пример того, что случилось со мной, когда я случайно удалил файл .003. К счастью, мне все равно, что случилось с локальной копией в .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" онлайн и мне очень помогает.

64 голосов
/ 05 июля 2013

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

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

Затем "git pull" в вашем локальном репо, и это также удалит файл локально.
Что делает этот ответ (окольным) способом удаления файла из git repo?
(Не говоря уже о том, что файл на GitHub - это в «git repo»)


delete button

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

commit a deletion

И вот так оно ушло.

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

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

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

См. " Восстановление удаленного файла в репозитории Git ".

51 голосов
/ 27 февраля 2015

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

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

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

EDIT: обратите внимание - после этой команды вы не сможете нажать или потянуть - вы увидите отклонение «несвязанной истории», которую вы можете использовать «git push --force -u origin master», чтобы нажать или потянуть

32 голосов
/ 17 апреля 2015

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

git rm -r foldername
23 голосов
/ 12 января 2010

В целом, 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
15 голосов
/ 20 марта 2015

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

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"
    
12 голосов
/ 23 января 2017

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

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

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

Если вы хотите полностью стереть его за один шаг, я рекомендую использовать 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.

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

10 голосов
/ 06 октября 2015

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
7 голосов
/ 23 августа 2016

Для удаления определенного файла

имя файла git rm

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

git clean -fdx

...