Как я могу удалить файл из git repo?

Я добавил файл с именем "file1.txt" сделать репо. После этого я совершил это, добавил пару каталогов под названием dir1 а также dir2и поручил им сделать git-репо.

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

27 ответов

Решение

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

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

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

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

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

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

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

Примечание. Так как это система контроля версий, 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

Ответ Greg Hewgill, отредактированный johannchopin, помог мне, так как я не заботился об удалении файла из истории полностью. В моем случае это был каталог, поэтому единственное изменение, которое я сделал, - это использование:

git rm -r --cached myDirectoryName

вместо "git rm --cached file1.txt" .., за которым следуют:

git commit -m "deleted myDirectoryName from git"
git push origin branch_name

Спасибо Greg Hewgill и johannchopin!

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

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, 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 чтобы полностью избавиться от этого файла в вашем репо.

По документации.

git rm --cached file1.txt

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

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

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

Примечание: если вы хотите удалить файл только из 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.

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

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

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

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

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

имя файла git rm

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

git clean -fdx

/questions/9199531/kak-ya-mogu-udalit-fajl-iz-git-repo/9199547#9199547 /questions/43540164/nastrojki-gitignore-vklyuchenyi-v-kommit/43540177#43540177 Очень похоже, пробовал оба. Ничего. Git продолжает отслеживать файл. (Я использую vscode, поэтому файл сразу помечается как U(неотслеживаемый) или A(добавленный))

Выполнение этого /questions/26648705/pochemugitignore-ne-ignoriruet-moi-fajlyi/26648727#26648727 для всей категории решает проблему.

Сделайте это, чтобы удалить файл из git и заставить git забыть о нем:

      **manually add the file name to .gitignore**

git rm --cached settings.py    
git commit -m "remove settings.py"
git push origin master
git rm -r --cached .
git add .
git commit -m "Untrack files in .gitignore"

ps: каждый раз, когда это не удавалось, я пытался удалить файл с конфиденциальной информацией, такой как токены (файлы .env и settings.py). Но со случайными файлами работает нормально oO

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

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

    git rm -r File-Name

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

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

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

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

    git push 
    

Перейдите в каталог вашего проекта и введите:

git filter-branch --tree-filter 'rm -f <deleted-file>' HEAD

после этого нажмите --force для удаления файла из всех коммитов.

git push origin --force --all

Для случая, когда git rm недостаточно, и файл необходимо удалить из истории: как git filter-branchСтраница руководства теперь сама предлагает использовать git-filter-repo, и мне пришлось сделать это сегодня, вот пример использования этого инструмента. Он использует пример репо https://example/eguser/eg.git

  1. Клонировать репозиторий в новый каталог git clone https://example/eguser/eg.git

  2. Сохраните все, кроме ненужного файла. git-filter-repo --path file1.txt --invert-paths

  3. Добавьте обратно источник удаленного репозитория:git remote add origin https://example/eguser/eg.git. В git-filter-repoинструмент удаляет удаленную удаленную информацию по дизайну и предлагает новое удаленное репо (см. пункт 4). Это имеет смысл для больших общих репозиториев, но может оказаться излишним для избавления от одного только что добавленного файла, как в этом примере.

  4. Если вас устраивает содержимое local, замените им удаленное.

    git push --force -u origin master. Форсировка требуется из-за измененной истории.

Также обратите внимание на полезные --dry-run вариант и хорошее обсуждение в связанном руководстве по динамике команды и проекта перед внесением платы и изменением истории репозитория.

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

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

Новый ответ, который работает в 2022 году.

Не использовать:

      git filter-branch

эта команда может не изменить удаленное репо после нажатия. Если вы клонируете его после использования, то увидите, что ничего не изменилось и репо по-прежнему имеет большой размер. Эта команда уже устарела. Например, если вы используете шаги в https://github.com/18F/C2/issues/439, это не сработает.

Вам нужно использовать

      git filter-repo

Шаги:

(1) Найдите самые большие файлы в .git:

      git rev-list --objects --all | grep -f <(git verify-pack -v  .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d " " | tail -10)

(2) Стратегическая фильтрация этих больших файлов:

       git filter-repo --path-glob '../../src/../..' --invert-paths --force

или

       git filter-repo --path-glob '*.zip' --invert-paths --force

или

       git filter-repo --path-glob '*.a' --invert-paths --force

или что вы найдете на шаге 1.

(3)

       git remote add origin git@github.com:.../...git

(4)

      git push --all --force

git push --tags --force

СДЕЛАННЫЙ!

Просто перейдя к файлу в своем репозитории github, вы увидите значок удаления рядом с Raw|Blame и не забудьте нажать кнопку фиксации изменений. И вы можете видеть, что ваш файл был удален.

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

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

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

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

  1. С использованиемGit
      git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch file.ext' HEAD
  1. С использованиемgit-filter-repo(получите его здесь, новый рекомендуемый способ Git)
      git filter-repo --path file.ext

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

git remove -f *.pyc

Если вы не используете файл в своем локальном репо, а в git-репо, просто откройте файл в git-репо через веб-интерфейс и найдите кнопку "Удалить" в правом углу интерфейса. Нажмите здесь, чтобы просмотреть интерфейс Удалить вариант

Другие вопросы по тегам