Удалите файл из репозитория Git, не удаляя его из локальной файловой системы
В моем первоначальном коммите содержались файлы журнала. Я добавил *log
в мой .gitignore
, и теперь я хочу удалить файлы журнала из своего репозитория.
git rm mylogfile.log
удалит файл из репозитория, но также удалит его из локальной файловой системы.
Как удалить этот файл из репо без удаления локальной копии файла?
Ответы
Ответ 1
Из файла man:
Когда --cached
, поэтапное содержимое должно соответствовать либо концу ветки, либо файлу на диске, что позволяет удалить файл только из индекса.
Итак, для одного файла:
git rm --cached mylogfile.log
и для одного каталога:
git rm --cached -r mydirectory
Ответ 2
Чтобы удалить всю папку из репо (например, файлы Resharper), выполните следующие действия:
git rm -r --cached folderName
Я сделал некоторые файлы resharper и не хотел, чтобы они сохранялись для других пользователей проекта.
Ответ 3
Вы также можете удалить файлы из репозитория на основе .gitignore, не удаляя их из локальной файловой системы:
git rm --cached `git ls-files -i -X .gitignore`
Или, альтернативно, на Windows Powershell:
git rm --cached $(git ls-files -i -X .gitignore)
Ответ 4
В соответствии с моим ответом здесь: fooobar.com/questions/1963/...
Чтобы удалить папку/каталог или файл только из репозитория git, а не из локальной, попробуйте 3 простых шага.
Шаги по удалению каталога
git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master
Шаги, чтобы игнорировать эту папку в следующих коммандах
Чтобы игнорировать эту папку из следующих коммитов, создайте один файл в корневом каталоге с именем .gitignoreи вставьте это имя папок в него. Вы можете разместить столько, сколько хотите
.gitignore файл будет выглядеть следующим образом
/FolderName
![remove directory]()
Ответ 5
Кроме того, если вы отправили конфиденциальные данные (например, файл, содержащий пароли), вы должны полностью удалить его из истории репозитория. Здесь объясняется, как это сделать:
http://help.github.com/remove-sensitive-data/
Ответ 6
Более общее решение:
-
Изменить .gitignore
файл.
ECHO mylogfile.log >> .gitignore
-
Удалите все элементы из индекса.
git rm -r -f --cached .
-
Восстановить индекс.
git add .
-
Сделать новую фиксацию
git commit -m "Removed mylogfile.log"
Ответ 7
Git позволяет игнорировать эти файлы, предполагая, что они не изменились. Эта выполняется командой git update-index --assume-unchanged
path/to/file.txt
. После маркировки файла как такового git будет полностью игнорировать любые изменения в этом файле; они не появятся, когда запуская git статус или git diff, и они никогда не будут зафиксированы.
(Из https://help.github.com/articles/ignoring-files)
Следовательно, не удаляя его, но игнорируя его изменения навсегда.
Я думаю, что это работает только на местном уровне, поэтому сотрудники все еще могут видеть изменения в нем, если они не выполняют ту же команду, что и выше. (Все еще нужно проверить это.)
Примечание. Это не отвечает на вопрос напрямую, но основывается на последующих вопросах в комментариях к другим ответам.
Ответ 8
Если вы хотите просто удалить файл и не удалить его из локального и удаленного репо, используйте команду thhis:
git update-index --assume-unchanged file_name_with_path
Ответ 9
Приведенные выше ответы не спомогли мне. Я использовал filter-branch
для удаления всех зафиксированных файлов.
Удалите файл из репозитория 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