Команда Git, чтобы показать, какие конкретные файлы игнорируются .gitignore - PullRequest
545 голосов
/ 21 января 2009

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

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

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

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

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

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

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

Ответы [ 9 ]

543 голосов
/ 22 января 2009

Примечания:


Также интересно (упомянуто в qwertymk answer ), вы также можете использовать команду 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

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


* +1078 * Пример:
$ 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

должен сделать трюк.

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

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

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

387 голосов
/ 23 августа 2012

Существует гораздо более простой способ сделать это (git 1.7.6 +):

git status --ignored

См. Есть ли способ указать git-status игнорировать эффекты файлов .gitignore?

386 голосов
/ 04 февраля 2010

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

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.

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

38 голосов
/ 19 сентября 2009

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

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

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

и .gitignore вроде этого:

# cat .gitignore
doc
tmp/*

Это игнорирует каталог doc и все файлы ниже tmp. 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 вообще не появляется.

17 голосов
/ 27 октября 2014

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

git check-ignore *

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

Ссылка на Git

12 голосов
/ 31 августа 2012

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

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, так как в нем перечислены все файлы, которые игнорируются. Обычно вы передаете результаты через grep, чтобы увидеть, есть ли там файл, который вы ожидаете игнорировать, или если там есть файл, который вы не хотите игнорировать.

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

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

git status --ignored

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

9 голосов
/ 28 августа 2015

Вот как напечатать полный список файлов в рабочем дереве, которые соответствуют шаблонам, расположенным в любом месте в нескольких источниках Gitignore Git (если вы используете 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 для достижения цели стабильности и простоты посредством модульности (информационной изоляции) и рассчитан на длительность длительного времени.

1 голос
/ 13 декабря 2018

(расширяя остальные ответы)

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

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

dirtokeep/**
!dirtokeep/.keep

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

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

0 голосов
/ 12 августа 2017

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

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

    node/logs/.gitignore 

.gitignore - это:

*

! .Gitignore

...