Git, чтобы показать, какие конкретные файлы игнорируются .gitignore

Я получаю мокрые ноги от мерзавца и имею следующую проблему:

Дерево исходного кода моего проекта:

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

У меня есть код (в настоящее время MEF) в моей ветке вендора, который я скомпилирую там, а затем перенесу ссылки в /src/refs откуда проект их забирает.

Моя проблема в том, что мой .gitignore настроен на игнорирование *.dll и *.pdb. Я могу сделать git add -f bar.dll чтобы форсировать добавление игнорируемого файла, это нормально, проблема в том, что я не могу понять, какие существуют файлы, которые игнорируются.

Я хочу перечислить пропущенные файлы, чтобы не забыть добавить их.

Я прочитал git ls-files страницу на git ls-files и не могу заставить ее работать. Мне кажется, что git ls-files --exclude-standard -i должен делать то, что я хочу. Что мне не хватает?

Ответ 1

Заметки:


Также интересно (упомянуто в ответе qwertymk), вы также можете использовать команду git check-ignore -v, по крайней мере, в Unix (не работает в сеансе CMD Windows)

git check-ignore *
git check-ignore -v *

Второй отображает фактическое правило .gitignore которое делает файл игнорируемым в вашем git-репо.
В Unix, используя " Что распространяется на все файлы в текущем каталоге рекурсивно? " И bash4+:

git check-ignore **/*

(или команда find -exec)


Оригинальный ответ 42009)

git ls-files -i

должен работать, кроме его исходного кода указывает:

if (show_ignored && !exc_given) {
                fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                        argv[0]);

exc_given?

Оказывается, ему нужен еще один параметр после -i чтобы на самом деле что-то перечислить:

Пытаться:

git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore

(но это будет только список вашего кэшированного (не -i gnored) объекта, с фильтром, так что это не совсем то, что вы хотите)


Пример:

$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
    --exclude='Documentation/*.[0-9]' \
    --exclude-from=.git/ignore \
    --exclude-per-directory=.gitignore

На самом деле, в моем файле 'gitignore' (называемом 'exclude') я нахожу командную строку, которая может вам помочь:

F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

Так....

git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard

должен сделать свое дело.

Как упомянуто на --others странице ls-files, --others является важной частью, чтобы показать вам не кешированные, не зафиксированные, обычно -i записанные файлы.

--exclude_standard - это не просто ярлык, а способ включить все стандартные настройки "игнорируемых шаблонов".

exclude-standard
Добавьте стандартные исключения git: .git/info/exclude, .gitignore в каждый каталог и user global exclusion file.

Ответ 2

Еще один вариант, который довольно чистый (без каламбура):

git clean -ndX

Объяснение:

$ git help clean

git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.

Примечание. В этом решении не отображаются проигнорированные файлы, которые уже были удалены.

Ответ 4

Хотя в целом правильное решение не работает при любых обстоятельствах. Предположим, что репо dir:

# ls **/*                                                                                                       
doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

и a .gitignore следующим образом:

# cat .gitignore
doc
tmp/*

Это игнорирует каталог doc и все файлы ниже tmp. Git работает как ожидалось, но данная команда для перечисления проигнорированных файлов не работает. Давайте посмотрим, что скажет git:

# git ls-files --others --ignored --exclude-standard                                                            
tmp/file1
tmp/file2

Обратите внимание, что doc отсутствует в списке. Вы можете получить его с помощью:

# git ls-files --others --ignored --exclude-standard --directory                                                
doc/

Обратите внимание на дополнительную опцию --directory.

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

Ответ 5

Git теперь имеет эту функциональность, встроенную в

git check-ignore *

Конечно, вы можете изменить glob на что-то вроде **/*.dll в вашем случае

Git Ссылка

Ответ 6

Достаточно использовать

git ls-files --others -i --exclude-standard

поскольку это охватывает все, что покрывается

git ls-files --others -i --exclude-from=.git/info/exclude

поэтому последнее является избыточным.


Вы можете сделать это проще, добавив псевдоним в ваш файл ~/.gitconfig:
git config --global alias.ignored "ls-files --others -i --exclude-standard"

Теперь вы можете просто набрать git ignored, чтобы просмотреть список. Намного легче запомнить и быстрее напечатать.

Если вы предпочитаете более сжатое отображение решения Джейсона Гэна, вы можете добавить псевдоним для этого:

git config --global alias.ignored "status --ignored -s"

Однако более подробный вывод более полезен для устранения неполадок с вашими файлами .gitignore, так как он перечисляет каждый файл хлопок-pickin, который игнорируется. Обычно вы передаете результаты с помощью grep, чтобы увидеть, есть ли файл, который вы ожидаете игнорировать, или если файл, который вы не хотите игнорировать, находится там.

git ignored | grep some-file-that-isnt-being-ignored-properly

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

git status --ignored

(-s обычно может быть отключен.)

Ответ 7

Вот как напечатать полный список файлов в рабочем дереве, которые соответствуют шаблонам, расположенным в любом месте Git-источника gitignore (если вы используете GNU find):

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose

Он проверит все файлы в текущей ветки хранилища (если вы не удалили их локально).

И это также идентифицирует конкретные исходные строки gitignore.

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

Отрицательные образцы gitignore также подобраны. Тем не менее, они легко различимы в списке, потому что они начинаются с ! ,

Если вы используете Windows, Git Bash включает GNU find (как показано в find --version).

Если список длинный (и у вас есть rev), вы можете отобразить их также по расширению:

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev

Для получения более подробной информации смотрите man find, man git-check-ignore, man rev и man sort.

Смысл всего этого подхода в том, что Git (программное обеспечение) быстро меняется и является очень сложным. В отличие от GNU find он чрезвычайно стабилен (по крайней мере, в его функциях, используемых здесь). Таким образом, любой, кто хочет быть конкурентоспособным, демонстрируя свои глубокие знания Git, ответит на вопрос по-другому.

Какой лучший ответ? Этот ответ намеренно сводит к минимуму зависимость от знаний Git для достижения цели стабильности и простоты с помощью модульности (информационной изоляции) и рассчитан на длительное использование.

Ответ 8

Предполагая, что существует несколько каталогов игнорирования, почему бы не использовать "git status node/logs/", который расскажет вам, какие файлы нужно добавить? В каталоге у меня есть текстовый файл, который не является частью вывода статуса, например:

В ветке мастера
Ваш филиал обновлен с помощью "origin/master".
Неотслеживаемые файлы:
(используйте "git добавить...", чтобы включить в то, что будет сделано)

    node/logs/.gitignore 

.gitignore:

*

Ответ 9

(расширяя другие ответы)

Обратите внимание, что git check-ignore использует фиксированный .gitignore а не тот, что в вашем рабочем дереве! Чтобы поиграть с ним, не загрязняя свою историю git, вы можете свободно попробовать отредактировать его, а затем зафиксировать с помощью git commit --amend.

Эта проблема возникает в основном, если вам нужен обходной путь, когда git не следует каталогам. Введите в .gitignore:

dirtokeep/**
!dirtokeep/.keep

.keep должен быть файлом нулевой длины в dirtokeep.

Результатом будет то, что все в dirtokeep будет игнорироваться, кроме dirtokeep/.keep, в результате чего также будет dirtokeep каталог dirtokeep в clone/checkout.