Удалите файл из репозитория 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