Git Global Ignore nie działa

84

Utworzyłem plik .gitignore_globali umieściłem go w katalogu instalacyjnym git. Kiedy uruchamiam polecenie:

git config --global core.excludesfile ~/.gitignore

reguły w pliku ignorowania nie są stosowane do moich zatwierdzeń.

Kiedy zmieniam nazwę pliku .gitignorei umieszczam go w katalogu głównym projektu, obowiązują zasady.

Co tu jest nie tak?

user880954
źródło
1
@Jarrod `~ / .gitignore_global` było tym, co oznaczał OP i tylko literówką w poście, chociaż zaakceptował moją odpowiedź, więc twoja edycja nie jest dobra
CharlesB
Czy to odpowiada na twoje pytanie? Global Git ignore
codeforester

Odpowiedzi:

169

Może musisz zrobić:

git config --global core.excludesfile ~/.gitignore_global 

I napić się kawy.

Charles B.
źródło
Przepraszam, o to mi chodziło. Ten, który skopiowałem, po prostu majstrował, żeby zobaczyć, co zadziałało.
user880954
Prawda do kawy i zębów. Czy na pewno .gitignore_global znajduje się w Twoim $ HOME? mówisz, że zainstalowałeś go w katalogu instalacyjnym git?
CharlesB,
masz jakiś pomysł, dlaczego nadal nie działa tutaj? Mam plik .7z, który chcę pominąć; Dodałem te zasady: gist.github.com/octocat/9257657 ; a po zmianie pliku nadal jest on wersjonowany na .git :(
Aquarius Power
3
Tak, gitignoreplik działa tylko w przypadku nieśledzonych plików, a nie tych, które zostały dodane wcześniej
CharlesB
1
Kolejną rzeczą, którą właśnie zauważyłem, był wzór linii w pliku .gitignore_global, który musi być DOKŁADNIE zgodny ze ścieżką z głównego katalogu projektu. Na przykład, jeśli nazwa projektu to myProject, która generuje kod SQL w myProject / sql / init i chcesz zignorować myProject / sql / init / *. Sql, wpis musi mieć postać * / sql / init /. Podobnie, dla wygenerowanego kodu DAO / DTO w myProject / msg / dao / i myProject / dao, muszą istnieć dwa wpisy do przechwytywania WSZYSTKICH plików w podkatalogach dao - należy dodać * / * / dao / i * / dao /.
Keith Kibler,
82

Pomyślałem, że wtrącę się w to. Jest jeszcze jeden powód, dla którego wydaje się, że globalny plik ignorowania nie działa. Jest to coś, o czym nie sądzę, by zostało uwzględnione we wcześniejszych odpowiedziach. To tak oślepiająco oczywiste, że - oczywiście - bardzo łatwo go przeoczyć.

To znaczy, że git będzie ignorował tylko nowe pliki . Jeśli plik jest już śledzony przez git, to oczywiście git go nie zignoruje! Więc jakiekolwiek wzorce w jakimkolwiek pliku gitignorelub excludepliku nie mają zastosowania .

To ma sens. Dlaczego git miałby chcieć ignorować modyfikacje plików, które już śledzi? Jeśli plik ma zostać zignorowany, musisz najpierw powiedzieć gitowi, aby go nie śledził, a następnie git zignorować go, jak opisano w podręczniku. Aby uzyskać informacje na temat usuwania śledzenia plików, zobacz tę odpowiedź .

To wszystko prowadzi mnie do pytania, czy można zignorować zmiany w śledzonych plikach? Ponownie, git zapewnia. Ta odpowiedź; Git: Ignore tracked files daje nam polecenie (zamień filena plik, który chcesz zignorować):

git update-index --assume-unchanged file

Na koniec, oto dodatkowe informacje na temat debugowania git ignore.

Strona podręcznika gitignore (5) mówi nam:

Wzorce, które użytkownik chce, aby Git ignorował we wszystkich sytuacjach (np. Kopie zapasowe lub pliki tymczasowe generowane przez wybrany edytor użytkownika) zwykle trafiają do pliku określonego przez plik core.excludesfile w pliku ~ / .gitconfig użytkownika. Jego domyślna wartość to $ XDG_CONFIG_HOME / git / ignore. Jeśli $ XDG_CONFIG_HOME nie jest ustawione lub puste, zamiast tego używany jest $ HOME / .config / git / ignore.

Jest to więc nowe i zastępuje poprzednie ~/.gitignore_globalwspomniane wcześniej.

Następnie, i to jest naprawdę przydatne, jest to, że od 1.8.2 mamy teraz kilka doskonałych narzędzi do debugowania. Spójrz na:

Git uczy się ignorować lepiej - nowość w wersji 1.8.2

To pokazuje, jak użyć check-ignoreflagi new, aby sprawdzić, czy git pomyślnie ignoruje twoje wzorce, np

git check-ignore bin/a.dll --verbose

Max MacLeod
źródło
8
git update-index --assume-unchanged filebył dokładnie tym, czego szukałem, dzięki!
Jai
14

Odkryłem, że kiedy zdefiniowałem global core.excludesfiletak:

git config --global core.excludesfile $HOME/.config/git/ignore

to nie zadziałało. Zmieniając go, aby nie używał $HOMEzmiennej, na przykład:

git config --global core.excludesfile ~/.config/git/ignore

natychmiast zaczął działać. Mam nadzieję, że to pomoże komuś innemu.

FYI:

$ git --version
git version 1.7.10.2 (Apple Git-33)
XP84
źródło
Ja też to obserwowałem. Przejrzałem dokumentację, ale nic nie znalazłem: Oprócz .gitignore (dla katalogu) i .git / info / exclude, git szuka w tym pliku wzorców plików, które nie są przeznaczone do śledzenia. „~ /” jest interpretowane do wartości $ HOME, a „~ user /” do katalogu domowego określonego użytkownika.
rliu,
9

Uwaga: uruchamianie git1.7.12 (sierpień 2012) :

Wartość:

  • core.attributesfile domyślnie $ HOME / .config / git / attributes i
  • core.excludesfiledomyślnie $HOME/.config/git/ignoreodpowiednio, gdy te pliki istnieją.

Więc jeśli tworzysz $HOME/.config/git/attributesplik, nie musisz nawet zmieniać core.excludesfileustawień.

VonC
źródło
4

Plik musi znajdować się w twoim katalogu domowym. W systemie Windows oznacza to zazwyczaj: C: \ dokumenty i ustawienia \ [użytkownik].

W systemie Linux jest to: / home / [użytkownik]

Leandro Casanova
źródło
2

Miałem ten problem, ponieważ początkowo wywołałem `` git config core.excludefiles '' bez opcji --global i ze złą wartością, a zatem zapisałem właściwość lokalnie. Wygląda na to, że lokalna właściwość ukryła globalną (która miała poprawną wartość), całkowicie ją ignorując.

Daniel Pinyol
źródło
2

Kolejny powód, dla którego globalne ignorowanie przez git może nie działać: niewidoczne znaki na ścieżce.

Dowiedziałem się, że to mój problem podczas wklejania ostrzeżenia z git-check-ignore do paska adresu Chrome, gdzie na szczęście stał się widoczny:

wprowadź opis obrazu tutaj

(Nie było to widoczne na terminalu. A to mogła być długa królicza dziura debugowania ... 😅)

1j01
źródło
1

Miałem ten sam problem (w systemie Windows). Skończyło się na sprawdzeniu mojego ~/.gitconfigpliku i stwierdzeniu, że mój excludesfilezostał ustawiony na:

excludesfile = C:\\Users\\myUserName\\Documents\\gitignore_global.txt

ale powinno być:

excludesfile = C:\\Users\\myUserName\\.gitignore_global

Po zmianie wszystko działało tak, jak powinno.

Pion
źródło
1

Miałem też zabawną rzecz z kodowaniem tego pliku. W jakiś sposób mój Windows 10 (z Powershell) utworzył plik z kodowaniem „UTF-16 LE” i Git jakoś nie mógł sobie z tym poradzić. Kiedy zmienię kodowanie na znacznie bardziej rozsądną wartość dosłownie czegokolwiek innego, zadziałało.

Wolfganga Stelzhammera
źródło
0

Innym trudnym do wyśledzenia powodem, dla którego .gitignore (_global) wydaje się nie działać, mogą być początkowe spacje w wierszach. Plik nie wybacza spacji wiodących. Więc upewnij się, że żadna linia twojego pliku nie zawiera żadnych, chyba że jest pusta. Zajęło mi trochę czasu, zanim się zorientowałem.

Dodam tylko moje dwa centy.

luanjunyi
źródło
0

Niedawno popełniłem błąd i uruchomiłem następujące polecenie, które git config core.excludesfile tags zmieniło ścieżkę excludesfile do pliku lokalnego w bieżącym repozytorium, a ta konfiguracja została zapisana do lokalnego pliku konfiguracyjnego poniżej .git/config, aby naprawić to, że właśnie otworzyłem .git/configplik i usunąłem wiersz excludesfile tagsi wszystko wróciło do normy.

Nafaa Boutefer
źródło