Как удалить файл из Git repo?

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

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

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 для поддержания контроля версий для веб-сайта моего бизнеса, но каталог "mickey" был папкой 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 для меня. The " Pro Git " книга онлайн и мне очень помогает.


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

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

delete button

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

commit a deletion

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

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

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

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

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


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

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, пультов, теги и все такое.

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

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

мерзавец чистым -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 имя файла

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

    git rm --кэшированное имя файла

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

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

    git push 
    

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

  1. переместить весь локальный РЕПО в другом месте
  2. клонировать РЕПО снова с master на локальный диск
  3. скопируйте файлы / папку из исходной копии в #1 обратно в новый клон из #2
  4. убедитесь, что проблема большого файла либо нет или исключен из списка .файл gitignore
  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=удалить
    • - r = рекурсивно удалить
    • -f = означает силу, потому что вы действительно имеете в виду это
    • obj является папка
  4. теперь бегите git commit -m "remove obj folder"

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

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


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


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