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


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

git rm mylogfile.log

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

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


2397


источник


Ответы:


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

git rm --cached mylogfile.log

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

git rm --cached -r mydirectory

3430



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

git rm -r --cached folderName

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


249



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

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

Или, альтернативно, на Windows Powershell:

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

155



Also, if you have commited sensitive data (e.g. a file containing passwords), you should completely delete it from the history of the repository. Here's a guide explaining how to do that: http://help.github.com/remove-sensitive-data/


66



As per my Answer here: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

To remove folder/directory or file only from git repository and not from the local try 3 simple steps.


Steps to remove directory

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

Steps to ignore that folder in next commits

To ignore that folder from next commits make one file in root named .gitignore and put that folders name into it. You can put as many as you want

.gitignore file will be look like this

/FolderName

remove directory


57



A more generic solution:

  1. Edit .gitignore file.

    ECHO mylogfile.log >> .gitignore

  2. Remove all items from index.

    git rm -r -f --cached .

  3. Rebuild index.

    git add .

  4. Make new commit

    git commit -m "Removed mylogfile.log"


54



Git lets you ignore those files by assuming they are unchanged. This is done by running the git update-index --assume-unchanged path/to/file.txt command. Once marking a file as such, git will completely ignore any changes on that file; they will not show up when running git status or git diff, nor will they ever be committed.

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

Hence, not deleting it, but ignoring changes to it forever. I think this only works locally, so co-workers can still see changes to it unless they run the same command as above. (Still need to verify this though.)

Note: This isn't answering the question directly, but is based on follow up questions in the comments of the other answers.


17



Above answers didn't work for me. I used filter-branch to remove all committed files

remove a file from a git repository with:

git filter-branch --tree-filter 'rm  file'

remove a folder from a git repository with:

git filter-branch --tree-filter 'rm -rf directory'

This removes the directory or file from all the commits

you can specify a commit by using:

git filter-branch --tree-filter 'rm -rf directory' HEAD

Or an range

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

To push everything to remote, you can do:

git push origin master --force

3