Удалить файл из репозитория Git, не удаляя его из локальной файловой системы


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

git rm mylogfile.log

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

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

9 2499

9 ответов:

для одного файла:

git rm --cached mylogfile.log

в одном каталоге:

git rm --cached -r mydirectory

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

git rm -r --cached folderName

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

вы также можете удалить файлы из репозитория на основе ваших .гитюдного без удаления их из локальной файловой системы :

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

или, как вариант, в Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)

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

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

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

  1. Edit .

    ECHO mylogfile.log >> .gitignore

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

    git rm -r -f --cached .

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

    git add .

  4. сделать новый коммит

    git commit -m "Removed mylogfile.log"

Git позволяет игнорировать эти файлы, предполагая, что они не изменились. Этот делается путем запуска . После маркировки файла как такового, git будет полностью игнорировать любые изменения в этот файл, они не будут отображаться, когда запуск git status или git diff, и они никогда не будут зафиксированы.

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

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

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

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

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

git update-index --assume-unchanged  file_name_with_path