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


1926

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

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


85
git rmэто правильный ответ, но помните, что файл все еще будет там в истории. Если вы хотите удалить файл, потому что он содержал конфиденциальную информацию, вам нужно сделать что-то более радикальное. (Изменение истории, особенно для контента, который вы уже добавили, является радикальным действием, и его следует избегать, если это возможно.)
Кит Томпсон

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

4
@KeithThompson, что это может быть, если я отчаянно хочу это сделать?
lessthanl0l


Ответы:


3226

Использование git rm.

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

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  

93
Также удобно: git rm -r directory // Удалить каталог и контент
Reg

10
Это не собирается избавляться от этого файла в других коммитах.
VaTo

6
@SaulOrtega: Это правильно. Чтобы удалить файл из предыдущих коммитов (изменение прошлой истории), см. Страницу справки GitHub в разделе Удаление конфиденциальных данных .
Грег Хьюгилл

15
Обратите внимание, что файл будет удален и локально. Если вы хотите удалить его только из репозитория, выполните: git rm --cached file1.txt
Weston Ganger

5
Стоит отметить, что если этот файл содержит конфиденциальную информацию (например, учетные данные), вы должны немедленно изменить эти учетные данные . Процитируем GitHub: «После того, как вы отправили коммит в GitHub, вы должны рассматривать любые содержащиеся в нем данные как скомпрометированные. Если вы зафиксировали пароль, измените его! Если вы зафиксировали ключ, сгенерируйте новый».
c1moore

608

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" онлайн и мне очень помогает.


6
Затем вам нужно будет зафиксировать это с помощью чего-то подобного, git commit -m "Just removing file1.txt"а затем, если у вас есть удаленный репозиторий, протолкнуть коммит с чем-то вроде git push origin master.
запрет геоинженерии

77

Во-первых, если вы используете git rm, особенно для нескольких файлов, учтите, что любой подстановочный знак будет разрешен оболочкой, а не gitкомандой.

git rm -- *.anExtension
git commit -m "remove multiple files"

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

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

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


кнопка удаления

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

совершить удаление

И просто так, это ушло.

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

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

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

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


4
Вы должны прокрутить до конца и нажать «Подтвердить изменения», чтобы подтвердить удаление!
LevinsonTechnologies

1
Это не работает для больших текстовых файлов. Сервер пытается отобразить файл, как на скриншоте, и затем завершается неудачно с ошибкой 500.
CapeCoder

9
Этот ответ относится к github, вопрос о git-репо. Не как использовать интерфейс GitHub.
Питер Маршалл,

65

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

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

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

РЕДАКТИРОВАТЬ: обратите внимание - после этой команды вы не сможете нажимать или тянуть - вы увидите отклонение «несвязанной истории», которую вы можете использовать «git push --force -u origin master», чтобы толкать или тянуть


9
Это отличный ответ, но обратите внимание, что в отличие от других ответов, эта команда переписывает историю коммитов и удаляет все следы файлов, соответствующих шаблону. Это особенно полезно, если вы обнаружили, что вы случайно зафиксировали некоторую конфиденциальную информацию (и, при необходимости, можете успешно использовать --force для перезаписи истории любых удаленных репозиториев, на которые была выдвинута).
yoniLavi

3
Это была именно та проблема, с которой я столкнулся, и потребовалось несколько проб и ошибок, чтобы понять это правильно. Парень, с которым я работал, совершил несколько больших дампов базы данных в репо, пройдя через множество коммитов. Вот почему я использовал .sql в моем примере. Мой репо стал настолько раздутым и большим, что github больше не мог принимать толчки.
Джейсон Глиссон

3
Если вы используете удаленный мастер, вам нужно принудительно зафиксировать коммит и нажать на негоgit push --force -u origin master
AlbertMarkovski

2
@AlbertMarkovski Извините, я не уточнил. Github на самом деле не принял бы толчок, потому что репо было за их пределом размера. По крайней мере, несколько ГБ. Они отрезали меня и написали мне об этом по электронной почте. Так что, к сожалению, никакое усилие толчка не помогло бы в этот момент.
Джейсон Глиссон

2
@JasonGlisson Я также столкнулся с той проблемой, когда видео было случайно добавлено в хранилище.
АльбертМарковский

34

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

git rm -r foldername

2
Это также удалит папку из локальной папки! Use git rm --cached -r <foldername>
Ось

24

В более общем случае, 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

6
Для более сложных вещей, я нахожу git helpзапутанным, но это хорошо для простых вещей :)
Джеймс Полли

9
На самом деле это не так уж хорошо для git noobs, потому что «index» не является концепцией, с которой git noobs знакомы. Я говорю из личного опыта быть мерзавцем :) Кроме того, я чувствую, что гораздо менее запутанно говорить, что rm ставит файл для удаления, а не для удаления из индекса (хотя для нубов это по-прежнему бессмысленно).
Роман Старков

Согласие с romkyns: описание «Удалить файлы из рабочего дерева и из индекса» не звучит для меня так, как будто это способ удалить файл из репозитория. Может быть, если бы я понял, что Git лучше Вместо этого это звучит так, как будто вы просто храните файлы (и необязательно удаляете их из рабочего дерева - это обязательно отразится на репо?)
LarsH

14

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

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

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

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

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

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

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

Примечание: если вы хотите удалить файл только из git, используйте ниже:

git rm --cached file1.txt

Если вы хотите удалить также с жесткого диска:

git rm file1.txt

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

git rm -r foldername

Если вы хотите удалить папку внутри другой папки

git rm -r parentFolder/childFolder

Тогда можно commitи pushкак обычно. Однако, если вы хотите восстановить удаленную папку, вы можете выполнить следующее: восстановление удаленных файлов из git возможно.

Из документа:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

ОПЦИИ

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

может понадобиться убежать от них. Можно указать начальное имя каталога (например, dir для удаления dir / file1 и dir / file2), чтобы удалить все файлы в каталоге и рекурсивно все подкаталоги, но для этого требуется явно указать параметр -r. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

параметры командной строки). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Читайте больше на официальном документе.


7

Чтобы удалить определенный файл

имя файла git rm

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

git clean -fdx


5

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

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

5

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

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

а позже этот файл был проигнорирован


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

    git rm -r File-Name

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

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

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

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

    git push 
    

удалит ли это все, что связано со случайно добавленным и переданным файлом?
бары

1

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

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

1

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


0

У меня есть файлы 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
    • гт = удалить
    • -r = рекурсивно удалить
    • -f = означает силу, потому что вы действительно это имеете в виду
    • obj это папка
  4. Теперь беги git commit -m "remove obj folder"

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

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


0

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

git remove -f *.pyc

0

Согласно документации .

git rm --cached giant_file

Когда дело доходит до конфиденциальных данных - лучше не говорить, что вы удалили файл, а просто включить его в последний известный коммит:

0. Изменить последний коммит

git commit --amend -CHEAD

Если вы хотите удалить файл из всей истории git, согласно документации вы должны сделать следующее:

1. Удалить его из вашей местной истории

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Не забудьте включить этот файл в .gitignore (если это файл, которым вы никогда не захотите поделиться (например, пароли ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Если вам нужно удалить с пульта

git push origin --force --all

4. Если вам также необходимо удалить его из выпусков тегов:

git push origin --force --tags

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.