Resync git repo с новым файлом .gitignore

192

Можно ли «обновить» репозиторий git после обновления файла gitignore?

Я просто добавил больше примечаний (?) К своему gitignore и хотел бы удалить материал из репо, соответствующий новому файлу.

Кристиан Ваттенгорд
источник
1
Разве это не похоже на stackoverflow.com/questions/1139762/gitignore-file-not-ignoring ?
VonC
Может быть, это решение удалит уже зафиксированные файлы, соответствующие новому gitignore?
Кристиан Ваттенгорд,
100
+1 за изобретение слова «невежество».
Aasmund Eldhuset
3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset это официально
Даниэль Спрингер
1
@ user770: сегодня я узнал!
Аасмунд Элдхусет

Ответы:

372

Решение, упомянутое в « .gitignore file not ignoring », немного экстремально, но должно работать:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( Убедитесь , что для совершения первого изменения , которые вы хотите сохранить , чтобы избежать любых инцидентов , как jball037 комментариев ниже . Вариант будет держать ваши файлы нетронутым на жестком диске , хотя.)
--cached

У вас также есть другое, более детальное решение в посте блога « Заставить Git игнорировать уже отслеженные файлы »:

git rm --cached `git ls-files -i --exclude-standard`

Бассим предлагает в своей редакции :

Файлы с пробелами в путях

В случае, если вы получите сообщение об ошибке, например fatal: path spec '...' did not match any files, могут быть файлы с пробелами в их пути.

Вы можете удалить все остальные файлы с опцией --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

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

git rm --cached "<path.to.remaining.file>"
VonC
источник
Я обнаружил, что шаг git add не нужен, когда я запускаю git status после git rm --cached, удаленные файлы уже находятся в промежуточной области, и вы можете просто продолжить и зафиксировать их.
глава
3
Я просто запустил это, потерял все свои незафиксированные изменения и чуть не объявил о своем уходе с работы. Принятый ответ в этой теме спас мне жизнь: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037
2
@VonC извините, это не предназначалось для того, чтобы быть рутом или палкой :) Но да, я использовал --cached, и все мои незафиксированные изменения были потеряны, когда я проверял свои файлы. Паниковал на мгновение, но «git reset HEAD» восстановил мои файлы (но на этот раз без файлов, которые я указал в .gitignore, так что ваше решение все еще работало!)
jball037
3
@ jball037 Хорошо. Я добавил предупреждение и отредактировал ответ соответственно.
VonC
1
если только я прочитал еще одну строку, прежде чем делать это "(убедитесь, что сначала зафиксировали ваши изменения, которые вы хотите сохранить, чтобы избежать любого инцидента как jball037" #fml
Эйден Стридом
9

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

Если вы хотите удалить проигнорированные файлы, ранее зафиксированные, используйте

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'
Гракх
источник
Что с одиночными кавычками здесь?
Игорь Ганапольский
Это отличный ответ
Holene
Это очень просто, зачем удалять файлы после того, как я обновляю свой .gitignore Однако для этого требуется пара незначительных обновлений: `` git rm –cached git ls-files -i –exclude-standard git commit -m ' cleanup ``
Аарон
1

Я знаю, что это старый вопрос, но решение gracchus не работает, если имена файлов содержат пробелы. Решение VonC для имен файлов с пробелами состоит в том, чтобы не удалять их используя --ignore-unmatch, а затем удалять их вручную, но это не будет работать хорошо, если их много.

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

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
Джейсон
источник