Как я могу удалить файл из 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 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"
Если вы хотите удалить файл из репозитория и из файловой системы, есть два варианта:
Если файл не имеет изменений, внесенных в указатель:
bykov@gitserver:~/temp> git rm file1.txt bykov@gitserver:~/temp> git commit -m "remove file1.txt"
Если в файле есть изменения, внесенные в указатель:
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
Это просто, просто сделай 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
- Не забудьте включить этот файл в.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}" и нажмите ввод.
- Зафиксируйте изменения и выполните повторную синхронизацию.
Сначала удалите файлы из локального хранилища.
git rm -r File-Name
или удалить файлы только из локального репозитория, но из файловой системы
git rm - кэшированное имя файла
Во-вторых, зафиксировать изменения в локальном хранилище.
git commit -m "unwanted files or some inline comments"
Наконец, обновите / вставьте локальные изменения в удаленный репозиторий.
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
Клонировать репозиторий в новый каталог
git clone https://example/eguser/eg.git
Сохраните все, кроме ненужного файла.
git-filter-repo --path file1.txt --invert-paths
Добавьте обратно источник удаленного репозитория:
git remote add origin https://example/eguser/eg.git
. Вgit-filter-repo
инструмент удаляет удаленную удаленную информацию по дизайну и предлагает новое удаленное репо (см. пункт 4). Это имеет смысл для больших общих репозиториев, но может оказаться излишним для избавления от одного только что добавленного файла, как в этом примере.Если вас устраивает содержимое local, замените им удаленное.
git push --force -u origin master
. Форсировка требуется из-за измененной истории.
Также обратите внимание на полезные
--dry-run
вариант и хорошее обсуждение в связанном руководстве по динамике команды и проекта перед внесением платы и изменением истории репозитория.
Я перепробовал много предложенных вариантов, но ни один из них не работал (я не буду перечислять различные проблемы). То, что я в конечном итоге сделал, что сработало, было простым и интуитивно понятным (для меня):
- переместить весь локальный репо в другое место
- снова клонируйте репо с мастера на локальный диск
- Скопируйте обратно файлы / папки из вашей оригинальной копии в #1 обратно в новый клон из #2
- убедитесь, что файл большой проблемы либо отсутствует, либо исключен из файла.gitignore
- сделать обычный 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
Проблема в том, что они уже находятся в удаленном режиме, и когда они меняются, они всплывают как измененные и загрязняют измененный список файлов.
Чтобы перестать их видеть, вам нужно удалить всю папку из удаленного хранилища.
В командной строке:
- CD в папку репо (т.е.
C:\repos\MyRepo
) - Я хочу удалить SSIS\obj. Кажется, вы можете удалить только на верхнем уровне, так что теперь вам нужно CD в SSIS: (т.е.
C:\repos\MyRepo\SSIS
) - Теперь введите магическое заклинание
git rm -r -f obj
- гт = удалить
- -r = рекурсивно удалить
- -f = означает силу, потому что вы действительно это имеете в виду
- obj это папка
- Теперь беги
git commit -m "remove obj folder"
Я получил тревожное сообщение о том, что 13 файлов изменено 315222 удалений
Тогда, потому что я не хотел искать строку CMD, я вошел в Visual Sstudio и сделал синхронизацию, чтобы применить ее к удаленному
если ваш файл является конфиденциальным (например, настройки или ключи, которые вы случайно добавили и зафиксировали), вы можете удалить его из всех версий.
Чтобы удалить из всех версий, используйте команду ниже ( предупреждение: будьте осторожны, потому что вы не сможете восстановить удаленный файл в репо, если у вас нет копии):
- С использованием
Git
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch file.ext' HEAD
- С использованием
git-filter-repo
(получите его здесь, новый рекомендуемый способ Git)
git filter-repo --path file.ext
Если вам нужно удалить файлы с определенным расширением (например, скомпилированные файлы), вы можете сделать следующее, чтобы удалить их все сразу:
git remove -f *.pyc
Если вы не используете файл в своем локальном репо, а в git-репо, просто откройте файл в git-репо через веб-интерфейс и найдите кнопку "Удалить" в правом углу интерфейса. Нажмите здесь, чтобы просмотреть интерфейс Удалить вариант