Удалить файл из репозитория Git, не удаляя его из локальной файловой системы - PullRequest
2764 голосов
/ 17 июля 2009

Мой первоначальный коммит содержал несколько файлов журнала. Я добавил *log к своему .gitignore, и теперь я хочу удалить файлы журналов из своего хранилища.

git rm mylogfile.log

удалит файл из хранилища, но также удалит его из локальной файловой системы.

Как мне удалить этот файл из репозитория без удаления моей локальной копии файла?

Ответы [ 9 ]

3964 голосов
/ 17 июля 2009

Из файла man:

Если задано --cached, промежуточное содержимое должно соответствовать либо концу ветви, либо файлу на диске, что позволяет удалить файл только из индекса.

Итак, для одного файла:

git rm --cached mylogfile.log

и для одного каталога:

git rm --cached -r mydirectory
262 голосов
/ 04 апреля 2012

Чтобы удалить всю папку из репозитория (например, файлы Resharper), выполните следующие действия:

git rm -r --cached folderName

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

185 голосов
/ 31 января 2014

Вы также можете удалить файлы из хранилища на основе вашего .gitignore, не удаляя их из локальной файловой системы:

git rm --cached `git ls-files -i -X .gitignore`

Или, в качестве альтернативы, в Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)
75 голосов
/ 24 августа 2015

Согласно моему ответу здесь: https://stackoverflow.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

remove directory

67 голосов
/ 21 августа 2011

Кроме того, если вы зафиксировали конфиденциальные данные (например, файл, содержащий пароли), вы должны полностью удалить их из истории хранилища. Вот руководство, объясняющее, как это сделать: http://help.github.com/remove-sensitive-data/

59 голосов
/ 13 декабря 2013

Более общее решение:

  1. Редактировать .gitignore файл.

    ECHO mylogfile.log >> .gitignore

  2. Удалить все элементы из индекса.

    git rm -r -f --cached .

  3. Перестроить индекс.

    git add .

  4. Создать новый коммит

    git commit -m "Removed mylogfile.log"

21 голосов
/ 28 января 2014

Git позволяет игнорировать эти файлы, предполагая, что они не изменены. это выполняется командой git update-index --assume-unchanged path/to/file.txt. После пометки файла как такового, git будет полностью игнорировать любые изменения в этом файле; они не появятся, когда запуск git status или git diff, и они никогда не будут зафиксированы.

(от https://help.github.com/articles/ignoring-files)

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

Примечание. Это не дает прямого ответа на вопрос, а основано на последующих вопросах в комментариях к другим ответам.

9 голосов
/ 15 августа 2018

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

git update-index --assume-unchanged  file_name_with_path
6 голосов
/ 12 января 2016

Вышеуказанные ответы не сработали для меня. Я использовал 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
...