Jak zignorować niektóre pliki w Git

731

Mam repozytorium z pliku Hello.java. Podczas kompilacji Hello.classgenerowany jest dodatkowy plik.

Utworzyłem wpis Hello.classw .gitignorepliku. Jednak plik nadal wydaje się być śledzony.

Jak sprawić, by Git ignorował Hello.class?

Kohan95
źródło
8
Co masz na myśli mówiąc „to nie działa”? Czy może już dodałeś Hello.class do swojego repozytorium? gitignores nie mają wpływu na treści, które są już śledzone. Zobacz na przykład stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

Odpowiedzi:

809

Problem polega na tym, że .gitignoreignoruje tylko pliki, które nie były wcześniej śledzone git add. Uruchom, git reset name_of_fileaby cofnąć scenę pliku i zachować go. Jeśli chcesz również usunąć dany plik z repozytorium (po wypchnięciu), użyj git rm --cached name_of_file.

Ondrej Slinták
źródło
190
Polecenie git rm --cached name_of_fileusunie plik z repozytorium git. Nawet jeśli dodasz go do pliku .gitignore. To nie jest ignorowanie, że usuwa.
OrwellHindenberg
4
Co wydaje się być tym, czego OP chciał w tym przypadku.
Ondrej Slinták
40
Cieszę się, że Twoje rozwiązanie zadziałało na @ Kohan95! Chociaż nazwa tego pytania powinna zostać zmieniona na podstawie wybranej odpowiedzi. Moje komentarze są tylko ostrzeżeniem dla deweloperów, którzy mogą nie wiedzieć, co robi polecenie.
OrwellHindenberg
91
git reset name_of_fileusuwa śledzenie i nie usuwa pliku.
Cees Timmerman,
7
Próbowałem git rm --cached <nazwa_pliku> Usunął plik z repozytorium, ale ponieważ był w pliku .gitignore, lokalna kopia nie została usunięta. Jako kolejną uwagę, aby dodać katalog, musisz wstawić go z ukośnikiem „/”. Usuwałem katalog config Rubymine w projekcie ruby, w którym ktoś się zameldował, czyli „.idea”. W pliku umieścić „.idea /”, a następnie «git rm --cached -r .idea», aby usunąć katalog i wszystko pod nim (bo git tylko wersje plików, a nie katalogi.)
Doug Noel
222

Jak zignorować nowe pliki

Globalnie

Dodaj ścieżki do pliku (plików), które chcesz zignorować .gitignore(i zatwierdź). Te wpisy pliku będą miały również zastosowanie do innych osób sprawdzających repozytorium.

Lokalnie

Dodaj ścieżki do pliku, które chcesz zignorować w swoim .git/info/excludepliku. Te wpisy pliku będą miały zastosowanie tylko do lokalnej kopii roboczej.

Jak zignorować zmienione pliki (tymczasowo)

Aby zignorować zmienione pliki, aby były wyświetlane jako zmodyfikowane, możesz użyć następującego polecenia git:

git update-index --assume-unchanged <file>

Aby przywrócić tę ignorancję, użyj następującego polecenia:

git update-index --no-assume-unchanged <file>
Xman Classical
źródło
Idealny do zapobiegania wypychaniu pliku zawierającego aktualny klucz API do github!
Jim In Texas
1
@Xman Dlaczego powiedziałeś, że to tymczasowo? Zrobiłem kroki, które wspomniałeś dla localgit ignore, i zrestartowałem system, nadal pokazuje działanie bezpośrednio czyste.
Vivek Vardhan
1
Dzięki za przydatną update-indexsztuczkę, absolutnie idealną, aby uniknąć zmiany .gitignorepliku, który jest następnie śledzony przez Git!
Thomas P.
@mcbjam Nie ma specjalnego polecenia git ignore. Edytuj plik .gitignore znajdujący się w odpowiednim miejscu w kopii roboczej. Następnie powinieneś dodać ten .gitignore i zatwierdzić. Każdy, kto klonuje repozytorium, zignoruje te pliki.
Xman Classical
@Vivek Vardhan git update-index --assume-niezmieniony jest jak tymczasowa maska ​​indeksu. Będzie obowiązywać, dopóki go nie wyłączysz. Aby wyjaśnić moją kwestię, indeks początkowo (to znaczy zaraz po drzewie odczytu git) „zawiera” wszystkie pliki z drzewa, które właśnie zostały wczytane. Dlatego Git „przymyka oczy”, aby wpis indeksu nie jest równoznaczny z jego usunięciem.
Xman Classical
150

Dodaj następujący wiersz do .gitignore:

/Hello.class

Wyklucza to Hello.class z git. Jeśli już to zrobiłeś, uruchom następującą komendę:

git rm Hello.class

Jeśli chcesz wykluczyć wszystkie pliki klas z git, dodaj następujący wiersz do .gitignore:

*.class
Armand
źródło
32
Dodanie Hello.classdo .gitignorezignoruje każdy plik wywołany Hello.classw dowolnym podkatalogu. Jeśli zamierzasz zignorować plik tylko Hello.classw tym samym katalogu, co .gitignoreplik, użyj /Hello.classzamiast tego wiersza.
nim
Gdzie umieścisz .gitignoreplik?
CodyBugstein
6
@Imray możesz umieścić w .gitignoredowolnym miejscu projektu git - jeśli ścieżka zaczyna się od /, będzie względna do położenia .gitignorepliku; w przeciwnym razie będzie rekurencyjnie odwoływał się do plików w bieżącym katalogu i jego katalogach potomnych.
Armand
109

1) Utwórz .gitignoreplik. Aby to zrobić, wystarczy utworzyć .txtplik i zmienić rozszerzenie w następujący sposób:

Wpisz opis zdjęcia tutaj

Następnie musisz zmienić nazwę, wpisując następujący wiersz w oknie cmd:

 rename git.txt .gitignore

Gdzie git.txtjest nazwa właśnie utworzonego pliku.

Następnie możesz otworzyć plik i zapisać w repozytorium wszystkie pliki, których nie chcesz dodawać. Na przykład mój wygląda następująco:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Gdy to zrobisz, musisz dodać go do swojego repozytorium Git. Musisz zapisać plik, w którym znajduje się twoje repozytorium.

Następnie w Git Bash musisz napisać następujący wiersz:

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

Jeśli repozytorium już istnieje, musisz wykonać następujące czynności:

  1. git rm -r --cached .
  2. git add .
  3. git commit -m ".gitignore is now working"

Jeśli krok 2 nie działa, powinieneś napisać całą trasę plików, które chcesz dodać.

SomeAnonymousPerson
źródło
Możesz użyć polecenia „kopiuj con .gitignore” w wierszu polecenia, a następnie naciśnij CTRL + Z, aby bezpośrednio utworzyć plik bez Eksploratora Windows.
heringer
61

Ignorować:

git update-index --assume-unchanged <path/to/file>

Aby cofnąć ignorowanie:

git update-index --no-assume-unchanged <path/to/file>
AV J
źródło
6
Chciałbym, aby to było na szczycie tabeli jako rozwiązanie problemu .... Jest bardzo prosty i elegancki
user1457958
„Jest bardzo prosty i elegancki” - niezupełnie : „Nie zakładaj, że nie zmienił się w przypadku mechanizmu ignorowania. Jest to „Wiem, że moje działania systemu plików są powolne. Ja obiecuję Git, że nie będzie zmienić te ścieżki ...” Zwłaszcza, że to nie obietnica ... że Git będzie zawsze brać pod uwagę te ścieżki są niezmodyfikowanej Git-jeśli można określić ścieżkę ... zmieniła się bez ponoszenia dodatkowych lstat(2)kosztów, to zastrzega sobie prawo zgłosić, że droga została zmodyfikowana (... git commit -ama prawo popełnić że zmiana) „.
Chris
47

Możesz użyć poniższych metod ignorowania / nie ignorowania zmian w śledzonych plikach.

  1. Za ignorowanie: git update-index --assume-unchanged <file>
  2. Aby przywrócić zignorowane pliki: git update-index --no-assume-unchanged <file>
kapillohakare
źródło
4
Czy to dotyczy wszystkich plików? Nie jest jasne, w jaki sposób te polecenia można zastosować do pojedynczego pliku, aby go zignorować / anulować.
javadba
@kapil w końcu !! coś, co faktycznie działa wśród trylionów wariantów poleceń git! Próbowałem każdej odpowiedzi, aby zignorować niektóre głupie pliki build.xml, które pojawiały się po każdej kompilacji ... dziękuję!
killjoy
1
Proszę nie : „Zakładaj, że niezmieniony nie powinien być nadużywany jako mechanizm ignorowania. Jest to „Wiem, że moje działania systemu plików są powolne. Ja obiecuję Git, że nie będzie zmienić te ścieżki ...” Zwłaszcza, że to nie obietnica ... że Git będzie zawsze brać pod uwagę te ścieżki są niezmodyfikowanej Git-jeśli można określić ścieżkę ... zmieniła się bez ponoszenia dodatkowych lstat(2)kosztów, to zastrzega sobie prawo zgłosić, że droga została zmodyfikowana (... git commit -ama prawo popełnić że zmiana) „.
Chris
22

Utwórz .gitignorew katalogu, w którym znajduje się .git. Możesz wyświetlić listę plików oddzielonych znakiem nowej linii. Możesz także używać symboli wieloznacznych:

*.o
.*.swp
stacja końcowa
źródło
3
Dobrą praktyką jest unikanie umieszczania wzorców specyficznych dla narzędzi (tj. Tymczasowych plików Vima) w .gitignoreplikach (chyba że projekt nakazuje to narzędzie). Możesz umieszczać wzory dla swoich ulubionych narzędzi w pliku wykluczającym na użytkownika (zestaw core.excludesFile); będą działać we wszystkich twoich repozytoriach. Np. git config --global core.excludesFile "$HOME/.git-user-excludes"Następnie umieść je w tym pliku.
Chris Johnsen
@Chris: Dzięki za wskazówkę. Ale właśnie tam napisałem, bo nic lepszego nie przyszło mi do głowy :)
zakończenie
1
@ChrisJohnsen „narzędzie specyficzne?” dla vima? myślę, że można bezpiecznie wykluczyć pliki wymiany vim ..
javadba
16

Z oficjalnej strony GitHub:

Jeśli plik jest już zalogowany i chcesz go zignorować, Git nie zignoruje pliku, jeśli dodasz regułę później. W takich przypadkach należy najpierw wyśledzić plik, uruchamiając w terminalu następującą komendę:

git rm --cached FILENAME

lub

git rm --cached .
Mile Mijatović
źródło
12

Powinieneś napisać coś takiego

*.class

do twojego .gitignorepliku.

KingCrunch
źródło
4
@AgentZebra Należy dodać wpis *.classdo swojego .gitignoredokonać git ignorować wszystkie pliki kończące się na .class.
KingCrunch,
7

Dodaj do pliku, które chcesz zignorować .gitignore:

*.klasa

*.projektowanie

* .prefs

*.projekt

Chinmoy
źródło
5

Jeśli plik został już zatwierdzony i próbujesz go zignorować, dodając do .gitignorepliku, Git go nie zignoruje. W tym celu musisz najpierw wykonać następujące czynności:

git rm --cached FILENAME

Jeśli zaczynasz projekt świeżo i chcesz dodać niektóre pliki do Git ignore, wykonaj poniższe kroki, aby utworzyć plik Git ignore:

  1. Przejdź do repozytorium Git.
  2. Wpisz „touch .gitignore”, który utworzy .gitignoreplik.
Savyasachi
źródło
3

Możesz także użyć .gitattributes (zamiast .gitignore), aby wykluczyć całe typy plików. Plik jest dość zrozumiały, ale wklejam tutaj zawartość w celach informacyjnych. Zwróć uwagę na ostatni wiersz (* .class binarny):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary
David Niki
źródło
2

Dodaj następujący wiersz do .git / info / exclude:
Hello.class

Boazeria
źródło
Czy powinieneś zmienić pliki w folderze .git?
Peter Mortensen
Może nie jest dobrym pomysłem ręczne dotknięcie tych plików w .git.
mgyky
2

Ta strona może być przydatna i oszczędzać czas podczas pracy .gitignore.

Automatycznie generuje pliki .gitignore dla różnych IDE i systemów operacyjnych z określonymi plikami / folderami, których zwykle nie chcesz pobierać do repozytorium Git (na przykład foldery specyficzne dla IDE i pliki konfiguracyjne).

Jaime Caffarel
źródło
1

Próbowałem tego -

  1. wyświetla listę plików, które chcemy zignorować

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Skopiuj zawartość kroku 1 i dołącz ją do pliku .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Uprawomocnić

git status .gitignore

podobnie możemy dodać katalog i wszystkie jego podkatalogi / pliki, które chcemy zignorować w statusie git za pomocą directoryname/*i wykonałem to polecenie z srckatalogu.

VIPIN KUMAR
źródło
1
  1. Przejdź do pliku .gitignore i dodaj pozycję dla plików, które chcesz zignorować
  2. Biegać git rm -r --cached .
  3. Teraz biegnij git add .
Rahul Garg
źródło
0

Próbowałem --assume-unchangedi również, .gitignoreale żaden z nich nie działał dobrze. Utrudniają zmianę gałęzi i łączenie zmian od innych. To jest moje rozwiązanie:

Po zatwierdzeniu ręcznie usuwam pliki z listy zmian

Zanim ciągnąć , ja schować zmienione pliki. A po pociągnięciu robię stash pop .

  1. git skrytka
  2. git pull
  3. git stash pop

Krok 3 czasami wyzwala scalenie i może doprowadzić do konfliktu, który musisz rozwiązać, co jest dobrą rzeczą.

Pozwala mi to zachować lokalne zmiany, które nie są udostępniane innym członkom zespołu.

John Henckel
źródło