.gitignore после коммита

210

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

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

Мадхур Ахаджа
источник
6
Будущие гуглеры могут найти это чрезвычайно полезным. Кратко и по существу: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Остин Дин

Ответы:

331

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

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

git rm --cached /\*.exe

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

manojlds
источник
6
@Madhur Ahuja На самом деле, если вы это сделаете, git rm /\*.exeон удалит все exe в вашем репо
manojlds
4
Для чего /?
Коста
5
@Costa они там, чтобы избежать звездочки, чтобы предотвратить интерпретацию оболочкой, как это предназначено git.
Ламбарт,
2
Предупреждение: файлы хранятся локально, это правда ... Но другие пользователи, работающие с git pull, увидят, что их файлы удалены.
ByScripts
42

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

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

git rm --cached path/to/ignored.exe
KingCrunch
источник
Означает ли это, что я удаляю по отдельности каждый .exe
Мадхур Ахаджа
Вы, вероятно, можете пакетировать это, но я не знаю, как это работает под Windows
KingCrunch
30

Если вы еще не отправили изменения:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push
slal
источник
15

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

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

а затем нажмите, чтобы освоить

Emanuele
источник
.ideaбыла моя проблема, я думаю, что это тоже ваша:)
Оливье Понс
5

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

Нет.

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

Страница man для git-filter-branch содержит подробные примеры.

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

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

sehe
источник
Я выполнил эту команду он показал Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) ВНИМАНИЕ: Ссылка «ссылки / главы / мастер» неизменна и ничего не произошло
Мадхур Ахаджа
Это предупреждение, и, скорее всего, это означает, что основная ветвь (пока) не содержала никаких ревизий с файлами, которые нужно удалить. Вы можете легко проверить это. Если есть проблема, пожалуйста, обновите вопрос. PS: используйте - --allчтобы переписать все (локальные) ветки сразу
сехе
1

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

ясень
источник