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

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

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

Ответ 1

Используйте 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  

Ответ 2

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 разделяет пару большие ресурсы: Эта страница имеет графику, которая помогает demystify git для меня. Книга "Pro Git" находится в сети и мне очень помогает.

Ответ 3

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

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

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

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

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


delete button

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

commit a deletion

И вот так, его нет.

For help with these features, be sure to read our help articles on creating, moving, renaming, и deleting files.

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

git rm -r foldername

Ответ 6

В более общем плане git help поможет, по крайней мере, в простых вопросах:

[email protected]:/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

Ответ 7

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

[email protected]:~/temp> git rm --cached file1.txt
[email protected]:~/temp> git commit -m "remove file1.txt from the repo"

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

  • Если файл не имеет изменений, поставленных в индексе:

    [email protected]:~/temp> git rm file1.txt
    [email protected]:~/temp> git commit -m "remove file1.txt"
    
  • Если файл имеет изменения, поставленные в индексе:

    [email protected]:~/temp> git rm -f file1.txt
    [email protected]:~/temp> git commit -m "remove file1.txt"
    

Ответ 8

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.

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

Ответ 9

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

Ответ 10

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

git rm имя_файла

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

git clean -fdx

Ответ 11

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

git rm --cached file1.txt

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

git rm file1.txt

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

git rm -r foldername

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

git rm -r parentFolder/childFolder

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

From doc:

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

OPTIONS

<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 to удалить каталоги/файл1 и каталоги/файл2) можно удалить все файлы в каталог, и рекурсивно все подкаталоги, но это требует опция -r должна быть указана явно. -f --force

Override the up-to-date check.

-n --dry-run

Dont 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

command-line options). --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.

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

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

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

    git rm -r Имя файла

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

    git rm --cached Имя файла

  • Во-вторых, Commit вносит изменения в локальный репозиторий.

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

    git push 
    

Ответ 15

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

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

Ответ 16

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

Ответ 17

У меня есть файлы 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 и сделал синхронизацию, чтобы применить ее к удаленному

Ответ 18

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

git remove -f *.pyc