Как получить список тех файлов, которые соответствуют правилу в файле .gitignore, но которые были поставлены или переданы в прошлом?
Как перечислить файлы, игнорируемые git, которые в настоящее время выполняются или выполняются?
Ответ 1
Документация к ls-files
написана не совсем четко, но похоже, что следующий простой псевдоним выполняет задание:
git config --global alias.showtrackedignored "ls-files -i --exclude-standard"
Вышеупомянутая команда создает псевдоним showtrackedignored
. Чтобы использовать, запустите:
git showtrackedignored
и он перечислит все файлы в текущем каталоге и подкаталогах, которые будут отслеживаться, но будут проигнорированы, если они не будут отслеживаться.
Ошибка в git ls-files
К сожалению, это не работает на 100% надежно. По-видимому, Git отлично справляется с поиском файлов, которые должны игнорироваться не, но при поиске файлов, которые игнорируются (опция -i
на git ls-files
), он не перечисляет проигнорированные файлы внутри каталога, если это каталог, соответствующий правилам игнорирования.
Чтобы обойти эту ошибку, попробуйте преобразовать свои правила игнорирования, чтобы сопоставлялись только файлы, а не каталоги (это не всегда возможно).
(Спасибо Christoph за обнаружение этой ошибки и сообщив об этом Git список рассылки! Редактировать: патч сейчас работает и превратится в Git 1.7.11.2 или новее)
Альтернативный подход
Здесь другой подход. Это намного сложнее и может сломать угловые случаи.
git config --global alias.showtrackedignored '!
cd "${GIT_PREFIX}" &&
untracked_list=$(git rev-parse --git-dir)/ignored-untracked.txt &&
git ls-files -o -i --exclude-standard >"${untracked_list}" &&
GIT_INDEX_FILE="" git ls-files -o -i --exclude-standard | grep -Fvxf "${untracked_list}" &&
rm -rf "${untracked_list}"'
Псевдоним делает следующее:
-
cd
Вернитесь в каталог, в котором был запущенgit showtrackedignored
(Git запускает алиасы на основе оболочки из каталога toplevel, а не текущий каталог, см. разделalias.*
вgit help config
) - Определите переменную с именем
untracked_list
. Эта переменная содержит путь к временному файлу, который будет содержать список игнорируемых в настоящее время файлов. Этот временный файл находится в каталоге.git
. - Запишите список игнорируемых файлов в
${untracked_list}
. - Сообщите Git действовать так, как если бы индекс был пустым и список всех проигнорированных файлов.
- Труба, которая выводится на
grep
, которая отфильтровывает файлы, которые были записаны на${untracked_list}
. - Удалить временный файл
${untracked_list}
.
Недостатки этого подхода:
- Создает временный файл в вашем каталоге
.git
. - Предполагается, что у вас есть совместимая с POSIX оболочка.
- Предполагается, что у вас есть POSIX-совместимая реализация
grep
.
Он также страдает от той же ошибки, что и прежний псевдоним.
Ответ 2
Просто собираюсь оставить это здесь, на основании ответа Ричарда:
git ls-files -i --exclude-standard | xargs git rm --cached
Это приведет к удалению каждого отслеживаемого файла, который игнорируется .gitignore
.
Ответ 3
На этот вопрос ответил fooobar.com/info/16774/.... В принципе, git clean -ndX расскажет вам, что можно безопасно игнорировать.