.gitignore после фиксации

У меня есть репозиторий git, размещенный на Github. После фиксации большого количества файлов я понимаю, что мне нужно создать .gitignore и исключить .exe, .obj файлы.

Однако будет ли он автоматически удалять эти зафиксированные файлы из репозитория? Есть ли способ заставить это?


person Madhur Ahuja    schedule 30.06.2011    source источник
comment
Будущие гуглеры могут найти это чрезвычайно полезным. Кратко и по делу: git-tower. com / learn / git / faq / ignore-tracked-files-in-git.   -  person Austin Dean    schedule 21.02.2018
comment
Отвечает ли это на ваш вопрос? Как заставить Git забыть о файле, который отслеживался, но теперь находится в .gitignore?   -  person LightCC    schedule 28.07.2020
comment
Правильный ответ здесь. Если вы git rm --cached (или просто удалите проблемные файлы и зафиксируете), он может удалить эти файлы при оформлении заказа. Использование git update-index --skip-worktree <files> удалит их непосредственное отслеживание.   -  person LightCC    schedule 28.07.2020


Ответы (6)


Нет, вы не можете принудительно удалить файл, который уже зафиксирован в репо, только потому, что он добавлен в .gitignore

Вы должны git rm --cached удалить файлы, которые вам не нужны в репо. (--cached, поскольку вы, вероятно, хотите сохранить локальную копию, но удалить ее из репо.) Итак, если вы хотите удалить все exe из репо, сделайте

git rm --cached /\*.exe

(Обратите внимание, что звездочка * цитируется в оболочке - это позволяет git, а не оболочке, расширять имена путей к файлам и подкаталогам)

person manojlds    schedule 30.06.2011
comment
@Madhur Ahuja На самом деле, если вы сделаете git rm /\*.exe, он удалит все exe в вашем репо - person manojlds; 30.06.2011
comment
Для чего нужны /? - person Costa Michailidis; 09.05.2014
comment
@Costa они существуют, чтобы избежать звездочки, чтобы оболочка не интерпретировала это, поскольку она предназначена для git. - person Lambart; 14.09.2016
comment
Предупреждение: файлы хранятся локально, это правда ... Но другие пользователи, использующие git pull, увидят свои файлы удаленными. - person Byscripts; 10.10.2019

Если вы еще не внесли изменения:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push
person slal    schedule 10.05.2017

Однако будет ли он автоматически удалять эти зафиксированные файлы из репозитория?

Нет. Даже с существующим .gitignore вы можете ставить "игнорируемые" файлы с помощью флага -f (принудительно). Если эти файлы уже зафиксированы, они не удаляются автоматически.

git rm --cached path/to/ignored.exe
person KingCrunch    schedule 30.06.2011
comment
Означает ли это, что я удаляю каждый .exe индивидуально - person Madhur Ahuja; 30.06.2011
comment
Вы, вероятно, сможете выполнить пакетную обработку, но я не знаю, как это работает под Windows. - person KingCrunch; 30.06.2011

Мне пришлось удалить папки .idea и target, и после прочтения всех комментариев это сработало для меня:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

а затем нажмите на мастер

person Emanuele    schedule 04.08.2015
comment
.idea это была моя проблема, я думаю, это была ваша тоже :) - person Olivier Pons; 05.01.2020

Однако будет ли он автоматически удалять эти зафиксированные файлы из репозитория?

No.

«Лучший» рецепт для этого - использовать git filter-branch, как написано здесь:

Страница руководства для git-filter-branch содержит исчерпывающие примеры.

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

Примечание. При наличии тегов всегда используйте параметр --tag-name-filter cat для git filter-branch. Это никогда не повредит и избавит вас от головной боли, когда вы позже поймете, что вам это нужно

person sehe    schedule 30.06.2011
comment
Я запустил эту команду, она показала Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) ПРЕДУПРЕЖДЕНИЕ: ссылка refs / Heads / master не изменилась, и ничего не произошло - person Madhur Ahuja; 30.06.2011
comment
Это предупреждение, и, скорее всего, означает, что основная ветвь (пока) не содержала никаких ревизий с файлами, которые нужно удалить. Вы легко можете это проверить. Если есть проблема, обновите вопрос. PS: используйте - --all, чтобы перезаписать все (локальные) ветки сразу - person sehe; 30.06.2011

Даже после того, как вы удалите файл (ы), а затем зафиксируете, у вас все равно останутся эти файлы в истории. Чтобы удалить их, рассмотрите возможность использования BFG Repo-Cleaner. Это альтернатива git-filter-branch.

person Ash    schedule 31.07.2015