Как вывести список файлов, игнорируемых git, которые в данный момент поставлены или зафиксированы? - PullRequest
58 голосов
/ 17 февраля 2012

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

Ответы [ 3 ]

81 голосов
/ 21 февраля 2012

Документация к ls-files написана не совсем четко, но кажется, что следующий простой псевдоним выполняет эту работу:

git config --global alias.showtrackedignored "ls-files -i --exclude-standard"

Приведенная выше команда создает псевдоним showtrackedignored.Чтобы использовать, запустите:

git showtrackedignored

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

Ошибка вgit ls-files

К сожалению, это не работает на 100% надежно.Очевидно, Git делает хорошую работу по поиску файлов, которые не следует игнорировать, но при поиске файлов, которые игнорируются (параметр -i для git ls-files), он не 'Перечислите пропущенные файлы в каталоге, если это каталог, который соответствует правилам игнорирования.

Чтобы обойти эту ошибку, попробуйте преобразовать правила игнорирования, чтобы сопоставлялись только файлы, а не каталоги (это не всегда возможно)).

(Спасибо Кристофу за обнаружение этой ошибки и сообщение о ней в списке рассылки 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 запускает псевдонимы на основе оболочки из каталога верхнего уровня, а не из текущего каталога, см. Раздел alias.* в git help config)
  • Определите переменную с именем untracked_list.Эта переменная содержит путь к временному файлу, который будет содержать список игнорируемых в данный момент файлов.Этот временный файл находится в каталоге .git.
  • Записать список игнорируемых файлов в ${untracked_list}.
  • Сказать Git действовать так, как будто индекс пуст, и перечислить все игнорируемые файлы..
  • Канал, который выводит в grep, который отфильтровывает файлы, которые были записаны в ${untracked_list}.
  • Удаляет временный файл ${untracked_list}.

Недостатки этого подхода:

  • Он создает временный файл в каталоге .git.
  • Предполагается, что у вас есть POSIX-совместимая оболочка.
  • Itпредполагается, что у вас есть POSIX-совместимая реализация grep.

Она также страдает от той же ошибки, что и прежний псевдоним.

12 голосов
/ 17 ноября 2017

Просто оставлю это здесь, основываясь на ответе Ричарда:

git ls-files -i --exclude-standard | xargs git rm --cached

Это удалит каждый отслеживаемый файл, который игнорируется .gitignore.

0 голосов
/ 17 февраля 2012

На этот вопрос хорошо ответили https://stackoverflow.com/a/467053. По сути, git clean -ndX скажет вам, что можно безопасно игнорировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...