Применение.gitignore к подтвержденным файлам
Я зафиксировал множество файлов, которые теперь хочу игнорировать. Как я могу сказать git игнорировать эти файлы от будущих коммитов?
РЕДАКТИРОВАТЬ: я тоже хочу удалить их из хранилища. Это файлы, созданные после сборки или для поддержки пользовательских инструментов.
11 ответов
- редактировать
.gitignore
соответствовать файлу, который вы хотите игнорировать git rm --cached /path/to/file
Смотрите также:
После редактирования .gitignore
чтобы соответствовать проигнорированным файлам, вы можете сделать git ls-files -ci --exclude-standard
просмотреть файлы, включенные в списки исключений; Вы можете сделать git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
удалить их из репозитория (не удаляя их с диска).
Редактировать: вы также можете добавить это как псевдоним в ваш файл.gitconfig, чтобы вы могли запускать его в любое время. Просто добавьте следующую строку в раздел [alias]:
apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
(The -r
флаг в xargs
предотвращает git rm
запускать пустой результат и распечатывать его сообщение об использовании, но может поддерживаться только GNU findutils. Другие версии xargs
может иметь или не иметь аналогичный вариант.)
Теперь вы можете просто набрать git apply-gitignore
в вашем репо, и он сделает всю работу за вас!
Чтобы оставить файл в репозитории, но игнорировать будущие изменения в нем:
git update-index --assume-unchanged <file>
и отменить это:
git update-index --no-assume-unchanged <file>
чтобы узнать, какие файлы были установлены таким образом:
git ls-files -v|grep '^h'
благодарность за оригинальный ответ на http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/
Убедитесь, что ваш реальный репозиторий - самая последняя версия
- редактировать
.gitignore
как хотите git rm -r --cached .
git add .
затем совершите как обычно
Старый вопрос, но некоторые из нас находятся в git-posh
(PowerShell). Это решение для этого:
git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }
- Добавьте ваше имя файла / путь к файлу в
.gitignore
файл. - Теперь запустите команду в git bash
git rm --cached file/path/from/root/folder
- Теперь зафиксируйте свой код, используя
git commit
.
Теперь файл не должен отслеживаться в
git status
команда.
После редактирования файла .gitignore.
git rm -r --cached ./ && git add ./ && git commit -a -m "Removing ignored files" && git push
Я склонен забывать/мне лень читать, что делают эти команды git. Поэтому я делаю это так:
- Я временно перемещаю все файлы, которые хочу игнорировать, за пределы репозитория
- Я фиксирую эти «удаленные файлы» в своем графическом интерфейсе git (теперь они не отслеживаются)
- Я обновляю файл .gitignore
- Я перемещаю файлы обратно в репозиторий (или удаляю их, если это было моим намерением)
Если вы загружаете с помощью git rm много файлов (скажем, 100 тысяч), ответы в этой теме можно улучшить, обработав список файлов (созданныйgit ls-files -ci --exclude-standard
) партиями. (AFAIK, параллельная обработка не будет работать с git из-за его механизма блокировки индекса.)
Пример пакетной обработки в Powershell:
$files = git ls-files -ci --exclude-standard
$batchSize = 100
for ($i = 0; $i -lt $files.Count; $i += $batchSize) {
$batch = $files[$i..($i + $batchSize - 1)]
git rm -f --cached $batch
}
В Windows верхняя граница — это предел длины командной строки. Для коротких путей вам может сойти с рук больший a.$batchSize
.
Если вы уже совершили, вы можете использовать это:
- Добавьте путь к папке в файл .gitignore.
- Запустите эту команду для удаления exe-файлов (для файлов с другими расширениями просто напишите «*extension»).
git rm --cached *exe
- Зафиксировать изменения.
Вы должны сделать это для каждого расширения, которое хотите удалить.
Следуй этим шагам:
Добавить путь к
gitignore
файлЗапустите эту команду
git rm -r --cached foldername
совершать изменения как обычно.