Dlaczego Git nie ignoruje mojego określonego pliku?

195

Dodałem następujący wiersz do .gitignore:

sites/default/settings.php

ale kiedy piszę git status, pokazuje plik jako plik niestacjonarny.

Jaki jest problem? Wszystkie inne wzorce działają dobrze.

Nick.h
źródło
Miałem ten sam problem, a potem odkryłem, że zamiast tego zapisałem plik .gitignore na innym dysku: face-palm:
Henry Chan
Przechowywanie rzeczy w repozytorium i ignorowanie zmian w nim jest bardzo złym pomysłem.
Jewgienij Afanasiew

Odpowiedzi:

370

Upewnij się, że .gitignoreznajdujesz się w katalogu głównym katalogu roboczego, w tym katalogu uruchom git statusi skopiuj ścieżkę do pliku z wyjścia statusu i wklej go do pliku .gitignore.

Jeśli to nie zadziała, prawdopodobnie plik jest już śledzony przez Git. Możesz to potwierdzić za pomocą danych wyjściowych git status. Jeśli pliku nie ma na liście w sekcji „Nieśledzone pliki” , oznacza to, że jest już śledzony przez Git i zignoruje regułę z .gitignorepliku.

Powodem ignorowania plików w Git jest to, że nie zostaną one dodane do repozytorium. Jeśli wcześniej dodałeś plik, który chcesz zignorować, będzie on śledzony przez Git, a reguły ignorowania pasujące do niego zostaną pominięte. Git robi to, ponieważ plik jest już częścią repozytorium.

Aby faktycznie zignorować plik, musisz go wyśledzić i usunąć z repozytorium. Możesz to zrobić za pomocą git rm --cached sites/default/settings.php. Spowoduje to usunięcie pliku z repozytorium bez fizycznego usuwania pliku (tak właśnie --cacheddziała). Po zatwierdzeniu tej zmiany plik zostanie usunięty z repozytorium, a zignorowanie go powinno działać poprawnie.

szturchać
źródło
Co rozumiesz przez „katalog główny katalogu roboczego”? Katalog, w którym znajduje się repozytorium „.git”?
Jonathan Leffler
Katalog roboczy to katalog, w którym ten .gitkatalog się znajduje i który sam jest katalogiem głównym repozytorium. Podobnie jak w przypadku klonowania repozytorium, /xy/wówczas /xy/katalog roboczy zawiera /xy/.git/wewnątrz.
poke
3
Czasami trzeba również zrobić git add .po, git rm --cachedaby poprawnie odbudować indeks.
Cooper
Pomysł sprawdzenia tego w git był genialny. Ciągle sprawdzałem to w Git Staging w Eclipse i ścieżka była niepoprawna. Dzięki!
walla
1
Musiałem dodać flagę -r (rekurencyjną), ponieważ włączyłem również zagnieżdżone foldery. W moim przypadku przeniosłem się do katalogu głównego folderu git, a następnie uruchomiłem polecenie git rm --cached -r .vs / Where vs był folderem najwyższego poziomu, który chciałem usunąć ze śledzenia.
Devology Ltd,
106

Wpadłem na to, to stare pytanie, ale chcę, aby ten plik był śledzony, ale aby nie śledzić go na niektórych kopiach roboczych, aby to zrobić, możesz uruchomić

git update-index --assume-unchanged sites/default/settings.php
Mescalito
źródło
5
Właśnie takiej odpowiedzi szukałem. Wszystkie pozostałe odpowiedzi zakładają, że plik został dodany za pomocą git add, co nie zawsze ma miejsce. W przypadku Acquia Cloud plik .gitignore powinien ignorować settings.php (na przykład), ale plik jest dołączany do pierwszego zatwierdzenia. Wyśledzenie pliku po prostu usuwa go z repozytorium, a zatem usuwa go z witryny na żywo ...
PatrickS
Pomógł mi też - dziękuję! Zagłosowano. Podejrzewam, że dotyczy to tylko lokalnego repozytorium git i nie utrzyma się, gdy zostanie zepchnięty na odległość i sklonowany przez innych deweloperów?
Ivan
1
Tak, to tylko lokalny.
Mescalito,
41

.gitignore zignoruje tylko pliki, które nie zostały jeszcze dodane do repozytorium.

Jeśli zrobiłeś git add ., a plik został dodany do indeksu, .gitignore ci nie pomoże. Musisz to zrobić, git rm sites/default/settings.phpaby go usunąć, a następnie zostanie zignorowany.

jonescb
źródło
dzięki. ale jak mogę usunąć plik tylko z indeksu, a nie z katalogu roboczego?
Nick.h
1
git rmpowinien to zrobić, ale może to wymagać podania opcji -f, która usunęłaby go z katalogu roboczego. Nie wymyśliłem tego inaczej niż zrobić kopię pliku, zrobić, git rm -fa następnie przywrócić kopię.
jonescb 30.09.10
Ten sam człowiek. Zrób gdzieś kopię, usuń ją, zatwierdź usunięty stan, dodaj pliki z powrotem i zobacz, jak są teraz ignorowane.
Jewgienij Afanasiew
18

Proszę użyć tego polecenia

git rm -rf --cached .
git add .

Czasami pliki .gitignore nie działają, nawet jeśli są poprawne. Powodem, dla którego Git ignoruje pliki, jest to, że nie są one dodawane do repozytorium. Jeśli dodałeś plik, który chcesz wcześniej zignorować, będzie on śledzony przez Git, a wszelkie pomijane reguły dopasowania zostaną pominięte. Git robi to, ponieważ plik jest już częścią repozytorium.

LiQiang
źródło
12

Miałem ten sam problem. Pliki zdefiniowane .gitingoretam, gdzie są wyświetlane jako pliki nieśledzone podczas działania git status.

Powodem było to, że .gitignoreplik został zapisany w UTF-16LEkodowaniu, a nie w UTF8kodowaniu.

Po zmianie kodowania .gitignorepliku na UTF8to działało dla mnie.

Floris Devreese
źródło
Czuję się jak noob z tego powodu ... cholera Windows
Coty Embry
Masz pojęcie, dlaczego kodowanie pliku ma znaczenie? Może niewłaściwie czytana ścieżka?
Chargnn
2

Co zrobiłem, aby zignorować plik settings.php :

  1. git rm - cached sites / default / settings.php
  2. zatwierdzenie (do tej pory nie działało)
  3. ręcznie usunięte strony / default / settings.php (to załatwiło sprawę)
  4. git add.
  5. zatwierdzić (zignorowano pomyślnie)

Myślę, że jeśli istnieje plik zatwierdzony w Git, to ignorowanie nie działa zgodnie z oczekiwaniami. Wystarczy usunąć plik i zatwierdzić. Potem to zignoruje.

Alper Ebicoglu
źródło
2

Są przypadki, np. Pliki konfiguracji aplikacji, które chcę śledzić w git (więc .gitignore nie będzie działać), ale muszę je zmienić dla ustawień lokalnych. Nie chcę, aby git zarządzał tymi plikami lub wyświetlał je jako zmodyfikowane. Aby to zrobić, używam skip-worktree:

git update-index --skip-worktree path/to/file

Możesz potwierdzić, że pliki są pomijane, wyświetlając listę plików i sprawdzając, czy linie zaczynające się na literę S są pomijane

git ls-files -v | grep ^S

Jeśli w przyszłości chcesz, aby git ponownie zarządzał plikiem lokalnie, po prostu uruchom:

 git update-index --no-skip-worktree path/to/file

Mescalito powyżej miało świetną odpowiedź, która poprowadziła mnie właściwą drogą, ale

git update-index --assume-niezmieniony plik / to / ignore.php

Ma umowę z git, w której: użytkownik obiecuje nie zmieniać pliku i pozwala Gitowi założyć, że działający plik drzewa pasuje do tego, co jest zapisane w indeksie.

Zmieniam jednak zawartość plików, więc w moim przypadku lepszym rozwiązaniem jest --skip-worktree.

Witryna Toshiharu Nishiny zapewniła doskonałe wyjaśnienie pomijania-pracy bez zakładania-niezmienionego: Ignoruj ​​pliki już zarządzane lokalnie za pomocą Git

J.Leupp
źródło
2

Kolejny możliwy powód - kilka wystąpień klientów git działających jednocześnie . Na przykład „git shell” + „GitHub Desktop” itp.


Zdarzyło mi się to, używałem „GitHub Desktop” jako głównego klienta i ignorowałem nowe ustawienia .gitignore: zatwierdzanie po zatwierdzeniu:

  1. Popełniasz coś.
  2. Następnie zatwierdzenie: ignoruje ustawienia .gitignore. Zatwierdzanie zawiera wiele plików tymczasowych wymienionych w .gitignore.
  3. Wyczyść pamięć podręczną git; sprawdź, czy .gitignore to UTF8; usuń pliki -> zatwierdz - - przenieś pliki z powrotem; pomiń 1 zatwierdzenie - nic nie pomogło.

Powód : edytor Visual Studio Code działał w tle z tym samym otwartym repozytorium. VS Code ma wbudowaną kontrolę git, co powoduje pewne konflikty.

Rozwiązanie : sprawdź dwukrotnie wielu ukrytych klientów git i używaj tylko jednego klienta git jednocześnie, szczególnie podczas czyszczenia pamięci podręcznej git.

Oleg Zarevennyi
źródło
1

Upewnij się, że .gitignore nie ma rozszerzenia !! Nie może to być .gitignore.txt, w systemie Windows wystarczy nazwać plik .gitignore. i to zadziała.

ZackOfAllTrades
źródło
0

Właśnie próbowałem tego z git 1.7.3.1 i podałem taką strukturę:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

gdzie repozatem jest wspomniany wyżej „root” (nazwałbym go rootem twojego drzewa roboczego) i .gitignorezawiera tylko sites/default/settings.php, ignorowanie działa dla mnie (i nie ma znaczenia, czy .gitignorezostanie dodane do repo, czy nie). Czy to pasuje do twojego układu repo? Jeśli nie, co się różni?

Johan
źródło
Tak. Jest dokładnie taki sam jak twój. Ale nie działa. Wszystkie inne wzorce działają. Jak powiedziałem, problem jest z pewnością związany z folderem settings.php.
Nick.h
Uważam, że trzymanie rzeczy w repozytorium i ignorowanie zmian w nim jest bardzo złym pomysłem.
Jewgienij Afanasiew
@YevgeniyAfanasyev z wyjątkiem rzeczy takich jak dane wyjściowe kompilacji, ustawienia użytkownika IDE, wszystkie inne pliki tymczasowe generowane przez twój zestaw narzędzi…
Chris F Carroll
Miałem na myśli utrzymanie popełnionego w repozytorium, a nie tylko plików znajdujących się w folderze projektu. Dlaczego potrzebujesz plików tymczasowych w repozytorium?
Jewgienij Afanasyjew,
0

Na wypadek, gdyby ktoś w przyszłości miał ten sam problem, co ja:

Jeśli korzystasz z

*
!/**/
!*.*

sztuczka, aby usunąć pliki binarne bez rozszerzenia, upewnij się, że WSZYSTKIE inne linie gitignore są PONIŻEJ. Git będzie czytał z .gitignore od góry, więc mimo że miałem „test.go” w moim gitignore, był on pierwszy w pliku i stał się „nieignorowany” po

!*.*
Alasdair Mclean
źródło
0

Próbowałem większość powyższych poleceń na terminalu VS Code i dostałem błędy takie jak:

fatal: pathspec '[dir]/[file]' did not match any files

Otworzyłem projekt na GitHub Desktop i stamtąd zignorowałem i zadziałało.

Danna Capellan
źródło