Jak zatrzymać wyświetlanie .gitignore na liście nieśledzonych plików?

971

Właśnie zrobiłem git initna podstawie mojego nowego projektu.

Potem utworzyłem .gitignoreplik.

Teraz, kiedy mam wpisać git status, .gitignore plik pojawi się na liście plików nieśledzonej. Dlaczego?

Jacques René Mesrine
źródło
13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair
1
Czy mogę zignorować folder .git / i umieścić go w „.gitignore”?
Timo,
2
Możesz utworzyć globalny „gitignore” w swoim katalogu domowym pod Linuksem i przechowywać go tam: git config --global core.excludesfile ~ / .gitignore_global
Timo
14
Przybyłem tutaj, szukając, how to gitignore .gitinore filea pytanie i zaakceptowana odpowiedź nie są tak naprawdę związane z tytułem. Tytuł można poprawić.
m.rufca
6
Istnieją przypadki użycia do zignorowania .gitignore. Przepływ pracy mojego zespołu wymaga ode mnie zmiany zestawu plików dla mojego lokalnego środowiska programistycznego, ale nie należy ich zatwierdzać. Przepływ pracy można ulepszyć dzięki lepszej architekturze, ale nie jest to możliwe. W międzyczasie zwracanie uwagi na te pliki jest odpowiedzialnością. Dlatego chcę je gitignore, ale tylko lokalnie, i nie chcę ryzykować popełnienia mojego .gitignore, ponieważ nie powinien być udostępniany zespołowi.
Mark

Odpowiedzi:

959

.gitignorePlik powinien znajdować się w repozytorium, więc powinien rzeczywiście być dodawane i popełnione, jak git statussugeruje. Musi być częścią drzewa repozytorium, aby zmiany w nim mogły być scalane i tak dalej.

Więc dodaj go do swojego repozytorium, nie powinien być gitignored.

Jeśli naprawdę chcesz, możesz dodać .gitignoredo .gitignorepliku, jeśli nie chcesz, aby został zatwierdzony . Jednak w takim przypadku prawdopodobnie lepiej jest dodać ignorowanie .git/info/exclude, specjalny plik lokalny kasy, który działa podobnie jak .gitignore, ale nie pojawia się w „statusie git”, ponieważ znajduje się w .gitfolderze.

Zobacz także https://help.github.com/articles/ignoring-files

August Lilleaas
źródło
17
Czy nie powinno to być częścią metadanych repozytorium, a nie pliku, który jest śledzony?
endolith
13
Metadane repozytorium są lokalne dla repozytorium. Jeśli dodasz hak zatwierdzenia do swojego repozytorium, a ktoś sklonuje twoje repozytorium, nie dostanie na przykład hooka zatwierdzenia.
August Lilleaas,
91
@wukong, jeśli pracujesz w zespole, czy nie każdy powinien ignorować ten sam zestaw plików? Właśnie dlatego plik .gitignore zostaje dodany do repozytorium. Nikt nie mówi, że musisz wdrożyć go w ramach swojego projektu.
Ryan Lundy,
13
@endolith and wukong To nie musi być plik w twoim repozytorium. Możesz ignorować ustawienia w wielu różnych miejscach. GitHub ma świetny artykuł na ten temat help.github.com/ignore-files Możesz mieć globalne ustawienia ignorowania w dowolnym miejscu i możesz mieć określone ustawienia repo w metadanych .git dla repo.
Boushley,
6
@ deed02392 Korzystając z tych plików ignorowania, z pewnością musisz dokonać oceny tego, co w nich umieścisz, ale nadal mają one świetne zastosowania. Na przykład używam Vima, więc w moim globalnym gitignore mam pliki * .swp oznaczone jako ignorowane. W ten sposób nie muszę dodawać go do każdego z moich projektów, a faceci, którzy nigdy nie używają vima, nie muszą się tym martwić.
Boushley,
282

Jeśli chcesz przechowywać listę ignorowanych plików poza drzewem Git, możesz użyć pliku .git / info / exclude . Jest stosowany tylko do realizacji transakcji repo.

Paweł Hajdan
źródło
19
+1, jest to świetne dla ignorowania, które nie są związane z projektem, takich jak pliki kopii zapasowych emacs * ~, .DS_Store z OS X i tak dalej.
August Lilleaas,
38
@AugustLilleaas Osobiście wolę umieszczać te typy plików {edytor, platforma}, ~/.gitignorewięc są one ignorowane w każdym repozytorium, nad którym pracuję.
Michael Mior,
22
Po śledzeniu pliku możesz użyć go, git update-index --assume-unchanged <file>aby zatrzymać śledzenie zmian bez zmiany repozytorium. Jest to bardzo przydatne w dużych współdzielonych projektach, w których musisz wprowadzić lokalne zmiany, ale nikt inny nie chce, aby twoje rzeczy były zaangażowane w repozytorium. Zobacz blog.pagebakers.nl
Chris Esplin
6
@AugustLilleaas: Gitignore na użytkownika jest lepszy dla tego przypadku użycia.
Ślimak mechaniczny
3
dzięki za tę wskazówkę, używam git-svn, aby inni użytkownicy repozytorium svn na serwerze nie chcieli dokładnie
.gitignore się zalogował
74

Możesz umieścić wiersz .gitignorew swoim .gitignorepliku. Spowodowałoby to .gitignorezignorowanie pliku przez git. Nie sądzę, żeby to był dobry pomysł. Myślę, że plik ignorowania powinien być kontrolowany i śledzony w wersji. Po prostu umieszczam to tutaj dla kompletności.

1800 INFORMACJI
źródło
7
Pracował dla mnie! wersja 1.5.6.5. Zgadzam się również z 1800 INFORMACJĄ, że to nie jest dobry pomysł, ale myślę, że może być dobrze w niektórych kontekstach (powiedzmy, że używasz repozytorium git-svn i nie chcesz, aby pliki git-ish przechodziły do ​​svn). Plik wykluczeń jest prawdopodobnie lepszy.
J. Polfer,
4
@ehsanul - pliku nie można śledzić (nie należy go dodawać ani zatwierdzać). Możesz to wyśledzić. Prawdopodobnie nie jest to świetny pomysł w środowisku tylko dla git, ale jeśli zdarzy ci się np. Używać git jako inteligentnego klienta dla repozytorium subversion (bez reszty, <maniakalny śmiech>) - taka sztuczka jest świetna.
Tomasz Gandor
2
@IshanSrivastava Prawdopodobnie plik został już wyśledzony. Spróbuj uruchomićgit rm --cached .gitignore
Gideon
51

Możesz także mieć globalny .gitignoreplik git użytkownika , który będzie automatycznie stosowany do wszystkich twoich repozytoriów. Jest to przydatne dla IDE i plików edytorze (np swpi *~pliki do Vima). Zmień lokalizacje katalogów w zależności od systemu operacyjnego.

  1. Dodaj do swojego ~/.gitconfigpliku:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Utwórz ~/.gitignoreplik z wzorami plików, który chcesz zignorować.

  3. Zapisz pliki kropek w innym repozytorium, aby mieć kopię zapasową (opcjonalnie).

Za każdym razem, gdy kopiujesz, inicjujesz lub klonujesz repozytorium, twój globalny plik gitignore będzie również używany.

Alec the Geek
źródło
6
Uważam, że jest to najlepsze rozwiązanie w sytuacjach, w których redaktorzy pozostawiają pliki tymczasowe, np. *. Swp (VIM) i ._ * (TM), ponieważ nie ma sensu ciągłego dodawania tych reguł do każdego repozytorium git, i zmusić innych użytkowników z różnymi IDE do sprawdzenia tych plików.
Thomas Hunter II
1
Działa to doskonale w przypadku ignorowania, które nie powinny być przekazywane do żadnej gałęzi. Oczywiście zamień „nazwę użytkownika” na swoją rzeczywistą nazwę użytkownika i nie dodawaj drugiej sekcji [core] do .gitconfig, jeśli już ją masz - po prostu umieść linię wykluczeń pod istniejącą sekcją [core].
szmergiel
47

Jeśli ktoś już dodał .gitignoredo Twojego repozytorium, ale chcesz wprowadzić pewne zmiany i zignorować te zmiany, wykonaj następujące czynności:

git update-index --assume-unchanged .gitignore

Źródło .

Leif Gruenwoldt
źródło
5
Zły pomysł, istnieje powód .git/info/excludes.
Arrowmaster
6
Przypuszczam, że --assume-unchangedistnieje również powód . Dlaczego jedno jest lepsze od drugiego?
Leif Gruenwoldt,
9
A btw .git/info/excludesnie działa, jeśli plik jest już śledzony.
Leif Gruenwoldt,
To naprawdę pomogło mi z .gitignore, który został już zatwierdzony i dla którego nie chciałem dokonywać zmian. Korzystam z git 1.7.4.1 z repozytoriów Ubuntu 11.04, a strony pomocy dodają to do indeksu aktualizacji. „Tej opcji można również użyć jako zgrubnego mechanizmu na poziomie plików, aby zignorować niezatwierdzone zmiany w śledzonych plikach (podobne do tego, co robi .gitignore dla plików nieśledzonych). Git zawiedzie (z gracją) na wypadek, gdyby musiał zmodyfikować ten plik w indeksie np. podczas scalania w zatwierdzeniu; dlatego w przypadku zmiany założonego pliku, który nie został wyśledzony, należy ręcznie obsłużyć sytuację. ”
YonahW
Głosuję za tą odpowiedzią, ponieważ generalnie będziesz potrzebować tej akcji dla początkowego stanu repo master i zachować zalety funkcji git. Nie ma dobrego powodu, aby zignorować ten plik (kropkę)
Lazaros Kosmidis
37

Po dodaniu .gitignorepliku i zatwierdzeniu go nie będzie już wyświetlany na liście „nieśledzonych plików”.

git add .gitignore
git commit -m "add .gitignore file"
git status
Greg Hewgill
źródło
20

Wystarczy, że ktoś inny odczuje ten sam ból, co my. Chcieliśmy wykluczyć plik, który został już zatwierdzony.

Ten post był o wiele bardziej przydatny: zbyt późna praca z .git / info / exclude

Aby zignorować plik, należy użyć polecenia git remove Zobacz git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

testujesz to, przechodząc

git rm --dry-run *.log
(jeśli powiesz, że chcesz wykluczyć wszystkie pliki dziennika)

to wyświetli to , co byłoby wyłączone, gdybyś go uruchomił.

następnie

uruchamiasz go, przechodząc

git rm *.log
(lub dowolną ścieżkę / wyrażenie nazwy pliku)

Następnie dodaj *.loglinię do swojego .gitignorepliku.

Ewoluować
źródło
4
Oczywiście, możesz chcieć to zrobić, dodając odpowiednie wzorce (np. * .Log) do swojego .gitignore, aby nie zaśmiecały twojego, git statusjeśli pojawią się w przyszłości.
Patrick O'Leary
2
Chociaż mój problem nie był związany z tym samym co OP: Dziękujemy za poinformowanie mnie, że będę musiał użyć RM do „wyczyszczenia” mojego repozytorium po wprowadzeniu zmian w .gitignore (jeśli pliki są już zatwierdzone). Błąd Noob , Wiem, ale to było pierwsze miejsce, w którym osobiście widziałem, że ktoś o tym wspominał.
Mike
Dzięki za opinie. Tak, dlatego to napisałem, przybyłem tutaj i przeszedłem długą drogę, aby to również rozwiązać, pomyślałem, że dobrze byłoby to napisać. :)
Ewolucja
16

Oczywiście plik .gitignore pokazuje status, ponieważ nie jest śledzony, a git widzi go jako smaczny nowy plik do jedzenia!

Ponieważ .gitignore jest plikiem nieśledzonym, kandydat może zostać zignorowany przez git, gdy umieścisz go w .gitignore!

Odpowiedź jest prosta: wystarczy dodać wiersz:

.gitignore # Ignore the hand that feeds!

do pliku .gitignore!

I w przeciwieństwie do odpowiedzi Augusta, powinienem powiedzieć, że nie chodzi o to, że plik .gitignore powinien znajdować się w twoim repozytorium. Zdarza się, że tak może być, co często jest wygodne. I prawdopodobnie prawdą jest, że właśnie dlatego .gitignore został stworzony jako alternatywa dla .git / info / exclude, który nie ma opcji śledzenia przez repozytorium. W każdym razie sposób korzystania z pliku .gitignore zależy wyłącznie od Ciebie.

W celach informacyjnych sprawdź stronę man gitignore (5) na kernel.org.

gonić
źródło
15

Chodzi o to, aby umieścić w pliku pliki specyficzne dla twojego projektu .gitignorei (jak już wspomniano) dodać go do repozytorium. Na przykład .pyci .oplików, rejestruje, że testsuite tworzy niektóre mecze itd.

W przypadku plików tworzonych przez własną instalację, ale niekoniecznie pojawiających się dla każdego użytkownika (takich jak .swppliki, jeśli używasz vima, ukrytych katalogów ecplise itp.), Powinieneś użyć .git/info/exclude(jak już wspomniano).

Bayer
źródło
14

Po pierwsze, jak już wielu powiedziało, twój .gitignorepowinien być śledzony przez Git (i dlatego nie powinien być ignorowany). Pozwól mi wyjaśnić dlaczego.

(TL; DR: zatwierdzenie .gitignorepliku i użycie globalnego.gitignore do zignorowania plików utworzonych przez IDE lub system operacyjny)

Git jest, jak zapewne już wiesz, rozproszonym systemem kontroli wersji . Oznacza to, że pozwala przełączać się między różnymi wersjami (nawet jeśli programowanie zostało podzielone na różne gałęzie), a także umożliwia wielu programistom pracę nad tym samym projektem.

Chociaż śledzenie .gitignoreplików ma również zalety przy przełączaniu między migawkami, najważniejszym powodem, dla którego warto je zatwierdzić, jest udostępnienie pliku innym programistom pracującym nad tym samym projektem. Przesyłając plik do Git, inni współtwórcy automatycznie otrzymają .gitignoreplik po sklonowaniu repozytorium, więc nie będą musieli martwić się przypadkowym zatwierdzeniem pliku, który nie powinien zostać zatwierdzony (np. Pliki dziennika, katalogi pamięci podręcznej, poświadczenia bazy danych itp.). A jeśli w pewnym momencie projekt .gitignorezostanie zaktualizowany, mogą po prostu pobrać te zmiany zamiast ręcznie edytować plik.

Oczywiście będą pewne pliki i foldery, które chcesz zignorować, ale są one specyficzne dla Ciebie i nie dotyczą innych programistów. Nie powinny one jednak znajdować się w projekcie .gitignore. Istnieją dwa inne miejsca, w których możesz ignorować pliki i foldery:

  • Pliki i foldery tworzone przez system operacyjny lub IDE powinny być umieszczone w globalnym.gitignore . Zaletą jest to, że .gitignoredotyczy to wszystkich repozytoriów na twoim komputerze, więc nie musisz powtarzać tego dla każdego repozytorium. I nie jest udostępniany innym programistom, ponieważ mogą używać innego systemu operacyjnego i / lub IDE.
  • Pliki, które nie należą do projektu .gitignoreani do globalnego .gitignore, można zignorować za pomocą jawnego wykluczenia repozytorium wyour_project_directory/.git/info/exclude . Ten plik nie będzie udostępniany innym programistom i jest specyficzny dla tego pojedynczego repozytorium
Nic Wortel
źródło
Ładne wzmianki dla globalnych.gitignore
Gruber
Myślę, że po wstępnej konfiguracji plik .gitignore powinien zostać zignorowany, więc nie ma przypadkowych zmian. Nie oznacza to, że nie można go już zmienić, ale w pewien sposób jest chroniony przed wypadkami. Wypadki na tym pliku mogą wprowadzić zamieszanie, a nawet zagrozić pewnej pracy, dlatego też należy rozważyć również „uszczelnienie” (ignorowanie samego siebie).
Sasa
@Sasa .gitignoredziała tylko w przypadku ignorowania plików, które nie są jeszcze śledzone przez Git. Dodanie już śledzonego pliku .gitignorenie uniemożliwi wprowadzenia zmian w tym pliku. Nawet gdyby to było możliwe, w jaki sposób popełniłbyś zmianę, .gitignoregdy nakazuje Gitowi zignorowanie samego siebie?
Nic Wortel,
@Nic - szczegółowe wyjaśnienie przekazałem mojemu punktowi widzenia w osobnej odpowiedzi @ na dole tego wątku.
Sasa
12

Uważaj na następujący „problem” Czasami chcesz dodać katalogi, ale nie ma plików w tych katalogach. Prostym rozwiązaniem jest utworzenie .gitignore o następującej treści:

*

Takie szwy działają dobrze, dopóki nie zorientujesz się, że katalog nie został dodany (zgodnie z oczekiwaniami do Twojego repozytorium. Powodem tego jest to, że .gitignore również zostanie zignorowany, a tym samym katalog będzie pusty. Dlatego powinieneś zrobić coś takiego: :

*
!.gitignore
Labirynt
źródło
9

Wydaje się, że działa to tylko w przypadku bieżącego katalogu, Gitaby zignorować wszystkie pliki z repozytorium.

zaktualizuj ten plik

.git/info/exclude 

ze swoją dziką kartą lub nazwą pliku

*pyc
*swp
*~
Naskov
źródło
5

Jeśli już zalogowałeś się .gitignore i chcesz zignorować jego modyfikacje, sprawdź tę odpowiedź :

Spróbuj użyć tego polecenia:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Aby to cofnąć (jeśli kiedykolwiek chcesz zatwierdzić zmiany), użyj:

git update-index --no-assume-unchanged

AKTUALIZACJA :

Oto jak wyświetlić listę „zakładaj niezmienione” pliki w bieżącym katalogu:

git ls-files -v | grep -E "^[a-z]"

Ponieważ -vopcja użyje małych liter dla plików „zakładaj niezmienione” pliki.

Aaron
źródło
4

W moim przypadku chcę wykluczyć istniejący plik. Tylko modyfikowanie .gitignore nie działa. Wykonałem następujące kroki:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

W ten sposób wyczyściłem z pamięci podręcznej plik, który chciałem wykluczyć, i po dodaniu go do .gitignore .

Andrea Perdicchia
źródło
najlepsze rozwiązanie dla mnie. możesz także użyć git add. po drugie, po tym git commit -m „fixing
.gitignore
3

Przejdź do katalogu podstawowego repozytorium git i wykonaj następujące polecenie:

echo '\\.*' >> .gitignore

Wszystkie pliki kropek zostaną zignorowane, w tym ten nieznośny plik .DS_Store, jeśli używasz komputera Mac.

weffen
źródło
4
Nie zrobiłbym tego Potrzebne mogą być pliki kropkowe. Zamiast tego dodałbym dosłownie .gitignore i .DS_Store.
Edward Falk
2

Jest całkiem możliwe, że użytkownik końcowy chce, aby Git zignorował plik „.gitignore” po prostu dlatego, że foldery IDE utworzone przez Eclipse prawdopodobnie nie są takie same jak NetBeans lub inne IDE. Tak więc, aby zachować antagonistyczne podejście do kodu źródłowego IDE, łatwiej jest mieć niestandardowe ignorowanie git, które nie jest udostępniane całemu zespołowi, ponieważ indywidualni programiści mogą używać różnych IDE.

John Brown
źródło
1

.gitignorepolega na ignorowaniu innych plików. git dotyczy plików, więc chodzi o ignorowanie plików. Jednak, ponieważ git działa na plikach, ten plik musi istnieć jako mechanizm wyświetlania innych nazw plików.

Gdyby został nazwany .the_list_of_ignored_files, mogłoby to być nieco bardziej oczywiste.

Analogią jest lista rzeczy do zrobienia, których NIE chcesz robić. Chyba, że ​​gdzieś je gdzieś wymieniasz, istnieje jakaś lista rzeczy do zrobienia, o której się nie dowiesz.

Michael Durrant
źródło
1

Myślę, że są sytuacje, w których ignorowanie .gitignore jest bardzo przydatne. Na przykład, gdy masz wiele zespołów lub duży zespół pracujący na tej samej bazie kodu. W takim przypadku musisz mieć pewne konwencje, jedna z nich dotyczy tego, co jest ignorowane w git repo. Zwykle chodzi o ignorowanie plików i katalogów utworzonych przez IDE lub system operacyjny, niektóre wygenerowane dzienniki itp.

Istnieje jednak siła, która dąży do wprowadzenia niekonwencjonalnych zmian do .gitignorepliku. .gitignorePlik może być dodatkowo zmieniona przez nieodpowiedzialną osobę, przez pomyłkę, przez narzędzie, które jest używane, lub w innej sprawie.

Aby uzyskać przeciwdziałanie temu, możemy wykonać następujące czynności:

  1. Początkowy plik .gitignore powinien odzwierciedlać konwencję w zespole (zespołach),
  2. Po wypchnięciu należy go zabezpieczyć, dodając pozycję .gitignore i ponownie wprowadzić tę zmianę. .gitignorePlik jest w ten sposób „ zapieczętowany ”.

Plik „ zapieczętowany.gitignoremożna zmienić, tylko lokalnie, bez propagowania tych zmieniaczy do innych członków zespołu (zespołów). Jeśli jednak zmiana jest szeroko uzgodniona w całym zespole (zespołach), wówczas można ją „odblokować”, zmienić i ponownie „zapieczętować”. Tego nie da się zrobić przez pomyłkę, tylko celowo.

Niestety, nie możesz być w 100% chroniony przed głupotą, ale w ten sposób zrobiłeś wszystko, aby zapobiec głupotom.

Jeśli masz stosunkowo niewielki zespół z bardzo dobrymi profesjonalistami, nie byłoby to ważne, ale nawet ci faceci doceniliby mniejszą problem.

Używanie .git/info/excludejest fajne, gdy nie możesz nic zrobić z ustawieniami infrastruktury, wystarczy zakryć własne **, aby się nie pomylić.

Z punktu widzenia tego, co jest dobre, a co złe, głosuję za wprowadzeniem .gitignorepliku .gitignore do pliku, dając każdemu swobodę robienia na miejscu, co tylko chce, ale nie inwazji na innych.

Sasa
źródło
0

Odkryłem, że najlepszym miejscem do ustawienia ignorowania nieznośnych .DS_Storeplików jest .git/info/excludeplik.

Wydaje się, że IntelliJ robi to automatycznie po skonfigurowaniu w nim repozytorium git.

Stephen McConnell
źródło
1
Globalny plik ignorowania użytkownika byłby lepszym miejscem do zignorowania .DS_Store
Max Nanasy