Polecenie Git pokazujące, które konkretne pliki są ignorowane przez.gitignore

Jestem coraz mokre nogi z Git i mam następujący problem:

Moje drzewo źródeł projektu:

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

Mam kod (obecnie MEF) w mojej gałęzi vendor, który skompiluję tam, a następnie przeniosę referencje do /src/refs, Skąd projekt je pobiera.

Mój problem polega na tym, że moje .gitignore ustawione na ignorowanie *.dll i *.pdb. Mogę zrobić git add -f bar.dll, aby wymusić dodanie ignorowanego pliku, który jest ok, problem polega na tym, że nie mogę dowiedzieć się, aby lista jakie pliki istnieją, które są ignorowane.

Chcę wyświetlić listę ignorowanych plików, aby upewnić się, że nie zapomnę ich dodać.

Przeczytałem stronę podręcznika na git ls-files i nie mogę tego zrobić. Wydaje mi się, że powinienem robić to, co chcę. Co przegapiłem?

 695
Author: Matthias Braun, 2009-01-21

9 answers

Uwagi:


Również ciekawe (wspomniane w qwertymk'S answer), możesz również użyć git check-ignore -v W przeciwieństwie do innych systemów operacyjnych, system operacyjny nie jest w pełni funkcjonalny.]}

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

Drugi wyświetla rzeczywistą regułę .gitignore, która sprawia, że plik ma być ignorowany w repo git.
Na Uniksie, używając " co rekurencyjnie rozszerza się na wszystkie pliki w bieżącym katalogu? " i bash4+:

git check-ignore **/*

(lub find -exec polecenie)

Uwaga: https://stackoverflow.com/users/351947/Rafi B. sugeruje w komentarzach do unikaj (ryzykownego) globstara :

git check-ignore -v $(find . -type f -print)

Należy jednak wykluczyć pliki z podfolderu .git/.


Oryginalna odpowiedź 42009)

git ls-files -i

Powinno działać, z wyjątkiem jego kod źródłowy wskazuje:

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

exc_given ?

Okazuje się, że potrzebuje jeszcze jednego parametru po -i, aby faktycznie anything:

Spróbuj:

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

(ale to tylko lista buforowany (nie-ignorowany) obiekt, z filtrem, więc nie jest to dokładnie to, czego chcesz)


Przykład:

$ 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

Właściwie, w moim pliku ' gitignore '(o nazwie' exclude'), znajduję wiersz poleceń, który może Ci pomóc:

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]
# *~

Więc....

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

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard
Powinno wystarczyć.

(Dzięki honzajde wskazując w komentarzach że git ls-files -o -i --exclude-from... robi Nie dołączanie plików w pamięci podręcznej: tylko git ls-files -i --exclude-from... (BEZ -o) tak.)

Jak wspomniano na stronie podręcznika LS-files, --others jest ważną częścią, aby pokazać Ci nie-buforowane, niezaangażowane, normalnie ignorowane pliki.

--exclude_standard to nie tylko skrót, ale sposób na włączenie wszystkich standardowych ustawień "ignorowanych wzorców".

exclude-standard
Dodawanie standardowych wyłączeń git: .git/info/exclude, .gitignore w każdym katalogu, a user's global exclusion file.

 731
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-01 22:40:14

Jest o wiele prostszy sposób, aby to zrobić (git 1.7.6+):

git status --ignored

Zobacz czy istnieje sposób, aby Git-status zignorował efekty .pliki gitignore?

 535
Author: Penghe Geng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-11 18:06:18

Kolejna opcja, która jest całkiem czysta (nie zamierzona gra słów.):

git clean -ndX

Wyjaśnienie:

$ 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.

Uwaga: To rozwiązanie nie wyświetli ignorowanych plików, które zostały już usunięte.

 403
Author: ma11hew28,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-06 01:46:33

Chociaż ogólnie popraw rozwiązanie nie działa we wszystkich okolicznościach. Załóżmy repo dir w ten sposób:

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

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

I a .gitignore like this:

# cat .gitignore
doc
tmp/*

To ignoruje katalog doc i wszystkie pliki poniżej tmp. Git działa zgodnie z oczekiwaniami, ale podane polecenie wypisywania ignorowanych plików nie działa. Rzućmy okiem na to, co git ma do powiedzenia:

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

Zauważ, że doc nie ma na liście. Można go dostać za pomocą:

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

Zwróć uwagę na dodatkowe --directory opcja.

Z mojej wiedzy nie ma jednej komendy do wypisania wszystkich ignorowanych plików naraz. Ale nie wiem dlaczego tmp/dir0 w ogóle się nie pojawia.

 40
Author: riyad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 20:14:04

Git ma teraz wbudowaną funkcjonalność

git check-ignore *

Oczywiście możesz zmienić glob na coś takiego jak **/*.dll w Twoim przypadku

Git Reference

 17
Author: qwertymk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-27 01:52:22

Powinno wystarczyć użycie

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

Jako że obejmuje wszystko, co obejmuje

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

Dlatego ten ostatni jest zbędny.


Możesz to ułatwić, dodając alias do pliku ~/.gitconfig:
git config --global alias.ignored "ls-files --others -i --exclude-standard"

Teraz możesz po prostu wpisać git ignored, aby zobaczyć listę. Dużo łatwiej zapamiętać i szybciej pisać.

Jeśli wolisz bardziej zwięzłe wyświetlanie rozwiązania Jasona Genga, możesz dodać alias do tego w następujący sposób:

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

Jednakże bardziej szczegółowe wyjście jest bardziej przydatne do rozwiązywania problemów z Twoim .pliki gitignore, ponieważ wypisuje każdy plik, który jest ignorowany. Zwykle Przełącz wyniki przez grep, aby sprawdzić, czy plik, którego oczekujesz, że zostanie zignorowany, lub czy plik, którego nie chcesz ignorować, jest tam.

git ignored | grep some-file-that-isnt-being-ignored-properly
Jeśli chcesz zobaczyć krótki wyświetlacz, łatwo go zapamiętać i wpisać]}
git status --ignored

(-s można normalnie przerwać.)

 14
Author: iconoclast,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 18:15:37

Oto jak wydrukować pełną listę plików w drzewie roboczym, które pasują do wzorców znajdujących się w dowolnym miejscu w wielu źródłach gitignore (jeśli używasz GNU find):

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

Sprawdzi wszystkie pliki w bieżącej gałęzi repozytorium (chyba że usunąłeś je lokalnie).

I identyfikuje również poszczególne linie źródłowe gitignore.

Git nadal śledzi zmiany w niektórych plikach, które pasują do wzorców gitignore, po prostu dlatego, że te pliki zostały już dodane. Powyższe polecenie wyświetla również te pliki.

Ujemne wzorce gitignore są również dopasowane. Są one jednak łatwo rozróżnialne na liście, ponieważ zaczynają się od !.

Jeśli używasz Windows, Git Bash Zawiera GNU find (jak ujawniono przez find --version).

Jeśli lista jest długa (i masz rev), możesz je również wyświetlić przez rozszerzenie (nieco):

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

Po Więcej szczegółów zobacz man find, man git-check-ignore, man rev i man sort.

Sednem tego całego podejścia jest to, że Git (oprogramowanie) szybko się zmienia i jest bardzo złożone. Dla kontrastu, find GNU jest ekstremalnie stabilny (przynajmniej w zastosowanych tutaj funkcjach). Tak więc każdy, kto chce być konkurencyjny poprzez pokazanie swojej dogłębnej wiedzy na temat Gita, odpowie na to pytanie w inny sposób.

Jaka jest najlepsza odpowiedź? This answer umyślnie minimalizuje swoje poleganie na wiedzy Git, w kierunku osiągnięcia cel stabilności i prostoty dzięki modułowości (izolacja informacji), i jest zaprojektowany tak, aby trwać długi Czas.

 13
Author: MarkDBlackwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-09 20:48:20

(Rozszerzanie innych odpowiedzi)

Uwaga, git check-ignore używa popełnionego .gitignore, a nie tego w twoim drzewie roboczym! Aby grać z nim bez zanieczyszczania historii Gita, możesz swobodnie spróbować go edytować, a następnie zatwierdzić za pomocą git commit --amend.

Ten problem występuje głównie wtedy, gdy potrzebujesz obejścia problemu, że git nie podąża za katalogami. Wpisz w .gitignore:

dirtokeep/**
!dirtokeep/.keep

.keep powinien być plikiem o zerowej długości w dirtokeep.

Wynik będzie taki, że Wszystko w dirtokeepzostanie zignorowane, z wyjątkiem dirtokeep/.keep, co spowoduje, że również katalog dirtokeep zostanie zbudowany na clone / checkout.

 1
Author: peterh - Reinstate Monica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-13 21:58:30

Zakładając, że istnieje kilka ignorowanych katalogów, dlaczego nie użyć "Git status node / logs/", który powie Ci, jakie pliki mają być dodane? W katalogu mam plik tekstowy, który nie jest częścią wyjścia stanu, np.:

On branch master
Twoja gałąź jest aktualna z "origin / master".
Untracked files:
(użyj " git add ..."zawierać w tym, co zostanie popełnione)

    node/logs/.gitignore 

.gitignore to:

*

!.gitignore

 -1
Author: pikknz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-12 11:24:19