Czy jest jakiś sposób, aby dowiedzieć się, dlaczego git ignoruje jakiś plik (tj. Która reguła w .gitignore
pliku powoduje ignorowanie pliku)?
Wyobraź sobie, że mam ten (lub znacznie bardziej złożony scenariusz, z setkami folderów i dziesiątkami .gitignore
plików:
/
-.gitignore
-folder/
-.gitignore
-subfolder/
-.gitignore
-file.txt
Jeśli uruchomię git add folder/subfolder/file.txt
git, może narzekać, że jest ignorowany:
The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.
Czy jest jakiś sposób, aby dowiedzieć się, który ze wszystkich możliwych .gitignore
ma regułę, aby zignorować ten plik, a także pokazać regułę? Lubić:
The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.
Lub tylko:
$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt
git check-ignore
wkrótce (git1.8.5 / 1.9) będzie miał--no-index
opcję. Zobacz moją odpowiedź poniżejGIT_TRACE_EXCLUDE=1 git status
wkrótce będzie dodatkowym sposobem debugowania.gitignore
reguł. Zobacz moją zredagowaną odpowiedź poniżejOdpowiedzi:
Zobacz stronę podręcznika, aby uzyskać więcej informacji.
Oryginalna odpowiedź brzmi:
git obecnie nie zapewnia czegoś takiego. Ale po zobaczeniu twojego pytania zrobiłem trochę googlingu i odkryłem, że w 2009 roku ta funkcja była wymagana i częściowo zaimplementowana . Po przeczytaniu wątku zdałem sobie sprawę, że nie będzie to zbyt wiele pracy, aby zrobić to poprawnie, więc zacząłem pracę nad łatką i mam nadzieję, że skończę ją następnego lub dwóch dni. Zaktualizuję tę odpowiedź, gdy będzie gotowa.
AKTUALIZACJA: Wow, to było o wiele trudniejsze niż się spodziewałem. Wewnętrzne
git
wykluczenia obsługi są dość tajemnicze. W każdym razie oto prawie skończony szereg zatwierdzeń , które mają zastosowanie do dzisiejszego upstreammaster
gałęzi. Pakiet testowy jest w 99% kompletny, ale nie skończyłem jeszcze obsługi tej--stdin
opcji. Mam nadzieję, że poradzę sobie w ten weekend, a następnie prześlę łatki na listę mailingową git.Tymczasem zdecydowanie chętnie przeprowadzę testy od każdego, kto może to zrobić - po prostu klonuj mojego
git
widelca , sprawdźcheck-ignore
gałąź i skompiluj ją jak zwykle.AKTUALIZACJA 2: Gotowe! Najnowsza wersja znajduje się na github, jak wyżej, i przesłałem serię poprawek na listę mailingową git do przeglądu. Zobaczmy, co myślą ...
AKTUALIZACJA 3: Po kilku miesiącach hakowania / recenzji łatek / dyskusji / oczekiwania, jestem zachwycony, że mogę powiedzieć, że ta funkcja dotarła teraz do
master
oddziału git i będzie dostępna w następnej wersji (1.8.2, spodziewana ósma Marzec 2013). Otocheck-ignore
strona podręcznika . Uff, to było o wiele więcej pracy, niż się spodziewałem!AKTUALIZACJA 4: Jeśli jesteś zainteresowany pełną historią o tym, jak ta odpowiedź ewoluowała i funkcja została wprowadzona w życie, sprawdź odcinek # 32 podcastu GitMinutes .
źródło
git check-ignore
nic nie robię.git check-ignore
jest obecna i działa w 1.8.2. Jeśli zachowanie nie jest zgodne z oczekiwaniami, sugeruję (ponownie) przeczytać stronę podręcznika, a jeśli nadal tak nie jest, prześlij odpowiedni raport o błędach na liście mailingowej git. Samo powiedzenie, że nic nie robi, nie jest zbyt pomocne. Spodziewam się, masz prawdopodobnie uruchomić go na plik non-ignorowane i są nieprawidłowo oczekując jakieś wyjście (choć zapewne dodać wsparcie--show-unmatched
dla--verbose
trybu wyjściowego w przyszłości).Zaktualizuj git 2.8 (marzec 2016):
Zobacz „ Sposób sprawdzania poprawności
.gitignore
pliku ”Jest to komplementarne do
git check-ignore -v
opisanego poniżej.Oryginalna odpowiedź: wrzesień 2013 (git 1.8.2, a następnie 1.8.5+):
git check-ignore
poprawia ponownie w git 1.8.5 / 1.9 (IV kwartał 2013) :Zobacz commit 8231fa6 z https://github.com/flashydave :
źródło
Nie mogę znaleźć niczego na stronie podręcznika, ale oto szybki i brudny skrypt, który sprawdzi twój plik w każdym katalogu nadrzędnym, aby sprawdzić, czy można go dodać. Uruchom go w katalogu zawierającym plik problemu jako:
gdzie
STOP_DIR
jest katalogiem najwyższego poziomu projektu Git iFILENAME
nazwą pliku problemu (bez ścieżki). Tworzy pusty plik o tej samej nazwie na każdym poziomie hierarchii (jeśli nie istnieje) i próbujegit add -n
sprawdzić, czy można go dodać (czyści po sobie). Wyprowadza coś takiego:Scenariusz:
źródło
Aby dodać do głównej odpowiedzi dotyczącej używania
git check-ignore -v filename
(dzięki BTW), stwierdziłem, że mój plik .gitignore blokuje wszystko, ponieważ po znaku wieloznacznym pojawiła się nowa linia, więc miałem:* .sublime-project
jako przykład. Właśnie usunąłem nową linię i voila! Zostało to naprawione.
źródło