2678

Вопрос по git, repository, git-rm, delete-file, remote-server – Удалить файл из репозитория Git, не удаляя его из локальной файловой системы

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

git rm mylogfile.log

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

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

Стоит отметить, что ответ с наибольшим количеством голосов является опасным для некоторых. Если вы используете удаленное репо, чем когда вы нажимаете локально, тогда извлекайте в другое место те файлы, которые вы удалили только из gitWILL BE DELETED, Это упоминается в одном из ответов, но не комментируется.

от RichieHH

ДубликатStop tracking and ignore changes to a file in Git

от user456814
9 ответов
5

Приведенные выше ответы не сработали для меня. я использовал

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 rm -r --cached NAME это хитрость, чтобы удалить его из локального репозитория git и предотвратить его влияние на любого, кто извлекает позже (удалив историю файла или каталога из git.)

от 

Спасибо, наконец, кто-то объясняет старый добрый пошаговый метод без каких-либо внешних инструментов

от 

Это переписывает историю git, и вам нужно будет нажать --force после этого, это немного выходит за рамки вопроса, который я думаю. В общедоступном репо вы не можете просто изменить линию истории, так как у всех, кто уже клонировал репо, возникнут проблемы при извлечении.

от 
58

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

Edit .gitignore file.

ECHO mylogfile.log >> .gitignore

Remove all items from index.

git rm -r -f --cached .

Rebuild index.

git add .

Make new commit

git commit -m "Removed mylogfile.log"

Я думаю, что вы хотите это:help.github.com/articles/remove-sensitive-data

от 

Моя проблема не GitHub - это то, чтоthe file will actually be deleted from coworkers when they pull, яdon't хотите, чтобы файл был удален. Это вызвало у меня огромные проблемы в прошлом. Поэтому мне было интересно, есть ли действительно решение, которое действительноdoes not удалить файл. Смотрите также комментарий в принятом ответе:stackoverflow.com/questions/1143796/…

от 

Из GitHub? NO. Если вы уже нажали на github, он не удалит его с сайта. Но это обновит ваш локальный репозиторий git.

от 

Комментарий, который вы удалили, был на самом деле более исключен :) Проблема с решениемrm --cashed это то, что он в конечном итоге удалит файл, когда кто-то тянет - правильно? И это не то, что люди хотят, когда говорят "Удалить файл из репозитория".without deleting it from the local filesystem& Quot ;. Теперь, почему принятое выше решение мне не подходит - возможно, ОП работал один и никогда не работал? Не знаю. Я понимаю, что GitHub "когда-то толкнул всегда" выпуск

от 

Будет ли это на самом деле удалить файл?

от 
66

Кроме того

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

Этот ответ должен включать необходимые команды для выполнения этой задачи вместо ссылки на другой веб-сайт.

от 

Я также хотел бы отметить, что я нашел с помощьюgit bfg repo cleaner tool проще и быстрее.

от 
21

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.

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

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

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

Хм, я делаю это, но вижу, что файл может быть перезаписан, если кто-то еще внесет изменения в репо.

от 
7

git update-index --assume-unchanged file_name_with_path

If you want to just untrack a file and not delete from local and remote repo then use thhis command:

Это то, что я ищу.

от 
3837

Для одного файла: git rm --cached mylogfile.log

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

git rm --cached mylogfile.log

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

git rm --cached -r mydirectory

@DGGenuine,--keep-local это аргументsvn rm

от 

может быть, потому что это не так очевидно, как--keep-local.

от 

@bdonian спасибо. Должна быть опция для новой версии git-rm. По иронии судьбы эта страница является лучшим результатом поиска в Google "git rm" - keep-local ""

от 

Но как сохранить файлы на удаленных серверах? Это сохраняет мой локальный, но если я нажму и потяну с другого сервера, файл будет удален. Я также добавил .gitignore для файла, но он все равно будет удален

от 

Спасибо! Я не уверен, как я пропустил это в человеке ... "Когда задано --cached, поэтапное содержимое должно соответствовать либо концу ветви, либо файлу на диске, что позволяет удалить файл только из индекс & Quot.

от mveerman
68

Согласно моему ответу здесь:

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 файл будет выглядеть так

/FolderName

remove directory

Из любопытства, как ты сделал размытие?

от 

@kmort Ха-ха, я сделал это, используя удивительный снимок экрана браузера Google Chrome & quot; инструмент, был действительно быстрым, поэтому выглядел грязно. Простите за это!!awesomescreenshot.com

от 
184

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

не удаляя их из локальной файловой системы:

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

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

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

Работает на Windows, если вы используете Git Bash вместо cmd-консоли

от 

Я не пытался, но это должно быть проверено, удалит ли он также файлы, такие как.gitkeep который сохраняет пустую папку в хранилище. Например..gitignore содержать папкуuploads и репо вынужден следить за.gitkeep, Убрав все из репо подuploads это также удалит.gitkeep.

от 

Люблю это. Работал за исключением того, что у меня были некоторые файлы, которые заканчивались тем, что имели пробелы в имени файла. Я изменил решение здесь к этому:git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}", Пожалуйста, подумайте об изменении или добавлении этого решения к ответу здесь, потому что это отличный инструмент для ...

от 

Не работает на Windows. git ls-files -i -X .gitignore работает, но я не знаю, как отправить файлы в «git rm». Ты знаешь как это сделать?

от 
258

Чтобы удалить всю папку из репозитория (например

файлы Resharper), сделайте следующее:

git rm -r --cached folderName

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

@RubberDuck Ответ 3 года, и единственное решение, которое сработало для меня :) Спасибо

от 

Просто добавленная заметка для будущих посетителей: не используйте графический интерфейс для «синхронизации»; коммит обратно в репо. Это вернет файлы обратно в ваш локальный репозиторий. Вы должны сделатьGit Push repo branch на самом деле удалить файлы с пульта.

от 

Похожие вопросы