Удалить файл из репозитория Git, не удаляя его из локальной файловой системы
Мой первоначальный коммит содержал несколько файлов журнала. я добавил *log
к моему .gitignore
и теперь я хочу удалить файлы журналов из своего хранилища.
git rm mylogfile.log
удалит файл из хранилища, но также удалит его из локальной файловой системы.
Как я могу удалить этот файл из репозитория, не удаляя мою локальную копию файла?
15 ответов
Для одного файла:
git rm --cached mylogfile.log
Для одного каталога:
git rm --cached -r mydirectory
Чтобы удалить всю папку из репозитория (например, файлы Resharper), сделайте следующее:
git rm -r --cached folderName
Я зафиксировал некоторые файлы для изменения резкости и не хотел, чтобы они сохранялись для других пользователей проекта.
Вы также можете удалить файлы из репозитория на основе вашего.gitignore, не удаляя их из локальной файловой системы:
git rm --cached `git ls-files -i -X .gitignore`
Или, в качестве альтернативы, в Windows Powershell:
git rm --cached $(git ls-files -i -X .gitignore)
Согласно моему Ответу здесь: https://stackru.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository
Чтобы удалить папку / каталог или файл только из репозитория git, а не из локального, попробуйте 3 простых шага.
Шаги по удалению каталога
git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master
Действия по игнорированию этой папки в следующих коммитах
Чтобы игнорировать эту папку из следующих коммитов, создайте в корневом каталоге один файл с именем .gitignore и поместите в него имя этой папки. Вы можете положить столько, сколько хотите
Файл .gitignore будет выглядеть так
/FolderName
Более общее решение:
редактировать
.gitignore
файл.ECHO mylogfile.log >> .gitignore
Удалить все элементы из индекса.
git rm -r -f --cached .
Перестрой индекс.
git add .
Сделать новый коммит
git commit -m "Removed mylogfile.log"
Кроме того, если вы передали конфиденциальные данные (например, файл, содержащий пароли), вы должны полностью удалить их из истории хранилища. Вот руководство, объясняющее, как это сделать: http://help.github.com/remove-sensitive-data/
Git позволяет игнорировать эти файлы, предполагая, что они не изменены. Это делается путем запуска
git update-index --assume-unchanged path/to/file.txt
команда. После пометки файла как такового, git будет полностью игнорировать любые изменения в этом файле; они не будут отображаться при запуске git status или git diff и никогда не будут зафиксированы.
(Из https://help.github.com/articles/ignoring-files)
Следовательно, не удаляя это, но игнорируя изменения в этом навсегда. Я думаю, что это работает только локально, поэтому коллеги по-прежнему могут видеть изменения, если они не выполняют ту же команду, что и выше. (Все еще нужно проверить это.)
Примечание. Это не дает прямого ответа на вопрос, а основано на последующих вопросах в комментариях к другим ответам.
Если вы хотите просто распаковать файл и не удалять его из локального и удаленного репозитория, используйте эту команду:
git update-index --assume-unchanged file_name_with_path
Игнорируйте файлы, удалите файлы из git, обновите git (для удаления).
Примечание: это не касается истории конфиденциальной информации.
Этот процесс определенно требует понимания того, что происходит с git. Со временем, получив это, я научился выполнять такие процессы, как:
1) Игнорируйте файлы
- Добавить или обновить проект
.gitignore
игнорировать их - во многих случаях, таких как ваш, родительский каталог, напримерlog/
будет используемым регулярным выражением. - совершить и подтолкнуть это
.gitignore
изменение файла (не уверен, нужен ли толчок, помните, ничего страшного, если это будет сделано).
2) Удалите файлы из git (только).
- Теперь удалите файлы из git (только) с помощью
git remove --cached some_dir/
- Убедитесь, что они по-прежнему остаются локально (должны!).
3) Добавьте и зафиксируйте это изменение (по сути, это изменение для "добавления" удаления, несмотря на запутанную команду "добавить"!)
git add .
git commit -m"removal"
Приведенные выше ответы не сработали для меня. Я использовал фильтр-ветку, чтобы удалить все зафиксированные файлы
удалить файл из репозитория git с помощью:
git filter-branch --tree-filter 'rm file'
удалить папку из репозитория git с помощью:
git filter-branch --tree-filter 'rm -rf directory'
Это удаляет каталог или файл из всех коммитов
Вы можете указать коммит, используя:
git filter-branch --tree-filter 'rm -rf directory' HEAD
Или диапазон
git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD
Чтобы перенести все на удаленное, вы можете сделать:
git push origin master --force
Я хотел бы добавить к принятому ответу @bdonlan .
ПОЖАЛУЙСТА! НЕ ИСПОЛЬЗУЙТЕ ЭТОТ ОТВЕТ ДЛЯ УДАЛЕНИЯ ФАЙЛОВ, СУЩЕСТВУЮЩИХ НА УДАЛЕННОМ УДАЛЕНИИ.
git rm --cached filename
Что должен делать ответ?
Предполагается, что из локальной промежуточной области будут удалены некоторые файлы, которые вы ошибочно зафиксировали.
- И еще не запихнули на пульт.
- Нажали на пульт, но над этим никто не работает.
Он перемещает файлы из Гусеничного 𝐭𝐨 Неотслеживаемого состояния на то , что я имею в виду, она удаляет файлы и добавляет их снова.
Но мы предполагаем, что он делает следующее:
𝐒𝐭𝐚𝐠𝐞𝐝 𝐬𝐭𝐚𝐭𝐞 => 𝐌𝐨𝐝𝐢𝐟𝐢𝐞𝐝 𝐬𝐭𝐚𝐭𝐞
и нет
𝐓𝐫𝐚𝐜𝐤𝐞𝐝 => 𝐔𝐧𝐭𝐫𝐚𝐜𝐤𝐞𝐝.
Что может пойти не так?
На пульте есть такая вещь, как 𝐮𝐧𝐭𝐫𝐚𝐜𝐤𝐞𝐝 𝐬𝐭𝐚𝐭𝐞, есть 𝐨𝐧𝐥𝐲 𝐭𝐫𝐚𝐜𝐤𝐞𝐝 𝐬𝐭𝐚𝐭𝐞, и это приводит к хаосу.Почему?
При совместной работе с командой, если вы 𝐩𝐮𝐬𝐡 такие изменения до удаленного, они будут удалены на удаленном, и вся команда, которая принимает 𝐩𝐮𝐥𝐥 от 𝐫𝐞𝐦𝐨𝐭𝐞 𝐰𝐢𝐥𝐥 𝐜𝐚𝐮𝐬𝐞 𝐝𝐞𝐥𝐞𝐭𝐢𝐨𝐧 𝐟𝐢𝐥𝐞𝐬 𝐰𝐡𝐢𝐜𝐡 𝐲𝐨𝐮 𝐡𝐚𝐯𝐞 𝐣𝐮𝐬𝐭 𝐫𝐞𝐦𝐨𝐯𝐞𝐝 𝐣𝐮𝐬𝐭 𝐟𝐫𝐨𝐦 𝐬𝐭𝐚𝐠𝐞𝐝.Сводка: вы удалили файлы из подготовленного, а затем отправили их, что приведет к удалению файлов и в локальном репозитории совместной группы (𝘸𝘩𝘪𝘭𝘦 𝘺𝘰𝘶 𝘩𝘢𝘷𝘦 𝘵𝘩𝘰𝘴𝘦 𝘧𝘪𝘭𝘦𝘴 𝘢𝘷𝘢𝘪𝘭𝘢𝘣𝘭𝘦 𝘪𝘯 𝘵𝘩𝘦 𝘶𝘯𝘵𝘳𝘢𝘤𝘬𝘦𝘥 𝘴𝘵𝘢𝘨𝘦, 𝘧𝘰𝘳 𝘢𝘭𝘭 𝘵𝘦𝘢𝘮𝘴 𝘪𝘵 будет 𝘨𝘰𝘯𝘦.)
Это зависит от того, что вы подразумеваете под словом "удалить" из git.:)
Вы можете отключить файл с помощью git rm --cached, подробнее см. Когда вы отключаете что-то, это означает, что это больше не отслеживается, но это не удаляет файл из предыдущих коммитов.
Если вы хотите сделать больше, чем деактивировать файл, например удалить конфиденциальные данные из всех предыдущих коммитов, вам нужно будет изучить фильтрацию ветки с помощью таких инструментов, как BFG Repo-Cleaner.
Я использовал следующий простой метод, чтобы удалить некоторые файлы, связанные с IDE, из git, поскольку они загромождали репозиторий.
Примечание. Это не удаляет их из истории git.
Примечание. Если вы случайно зафиксировали пароли, первое, что вам нужно сделать, — это изменить эти пароли.
- Зафиксируйте или отмените любые локальные изменения.
- Сделайте резервную копию файлов локально в другую папку.
- Удалите файлы из локального репозитория.
- Зафиксируйте изменение, при котором файлы будут удалены.
- Отредактируйте файл .gitignore, чтобы получить список файлов/папок.
- Скопируйте файлы локально обратно в исходное местоположение.
- Бегать
git status
и убедитесь, что файлы не указаны в списке. - Зафиксируйте изменения в .gitignore
сrm --cache
удалит файлы в удаленном репозитории, вы можете использоватьupdate-index
вместо этого
см.: https://learn.microsoft.com/en-us/azure/devops/repos/git/ignore-files?view=azure-devops&tabs=visual-studio-2019 .
Если вы хотите удалить файл в репозитории, но не в файловой системе, это означает, что вы не хотите отслеживать этот файл. В Git у вас есть 4 альтернативы (как указано здесь).
Вы можете использовать файл .gitignore. В этом случае файл/папка локально не отслеживается.
Вы можете редактировать .git/info/exclude аналогично предыдущему случаю. Здесь разница в том, что файл локально не отслеживается.
Вы можете использовать
git update-index assume-unchanged <filename>
команда для отслеживания файла, но локальные изменения игнорируются.Вы можете использовать
git update-index skip-worktree <filename>
команда для отслеживания файла, но локальные изменения игнорируются.
Пункты 3 и 4, кажется, делают одно и то же, но есть различия. По этой ссылке вы можете найти обширный список тестов на поведение этих точек. Подводя итог различиям, можно сказать, что флагassume-unchanged
предполагает, что разработчик больше не трогает файл. Флагskip-worktree
инструктирует git больше не трогать конкретный файл. Это полезно, когда вы добавляете в репозиторий файл конфигурации, но не хотите отслеживать его изменения.