Jak skonfigurować git, aby lokalnie ignorował niektóre pliki?


1350

Czy mogę ignorować pliki lokalnie, nie zanieczyszczając globalnej konfiguracji git dla wszystkich innych? Mam nieśledzone pliki, które są spamem w moim statusie git, ale nie chcę dokonywać zmian konfiguracji git dla każdego małego losowego nieśledzonego pliku, który mam w moich lokalnych oddziałach.

Odpowiedzi:


1860

Z odpowiedniej dokumentacji Git :

Wzorce, które są specyficzne dla konkretnego repozytorium, ale które nie muszą być współużytkowane z innymi powiązanymi repozytoriami (np. Pliki pomocnicze, które znajdują się w repozytorium, ale są specyficzne dla przepływu pracy jednego użytkownika) powinny przejść do $GIT_DIR/info/excludepliku.

.git/info/excludePlik ma ten sam format, jak każdy .gitignoreplik. Inną opcją jest ustawienie core.excludesFilenazwy pliku zawierającego wzorce globalne.

Uwaga: jeśli masz już zmiany niestacjonarne, po edycji wzorców ignorowania musisz uruchomić następujące czynności:

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

Uwaga na$GIT_DIR : Jest to notacja używana w całym podręczniku git, aby wskazać ścieżkę do repozytorium git. Jeśli zmienna środowiskowa jest ustawiona, zastąpi ona lokalizację repozytorium, w którym się znajdujesz, co prawdopodobnie nie jest tym, czego chcesz.


Edycja : Innym sposobem jest użycie:

git update-index --skip-worktree <file-list>

Odwróć to przez:

git update-index --no-skip-worktree <file-list>

204
Uwaga: należy uruchomić git update-index --assume-unchanged [<file>...]po dodaniu pliku wykluczającego. Zmiany nie zostaną uwzględnione do tego czasu.
— tollmanz

30
Nie musiałem uruchamiać „git update-index ...”, aby zmiany zaczęły obowiązywać przy użyciu git 1.7.9.5.
— Jeffrey Martinez,

39
Musisz użyć git update-index, tylko jeśli dokonałeś już zmiany w pliku i teraz chcesz go zignorować. Jeśli zmienisz wykluczenie przed dokonaniem zmiany, nie jest to konieczne.
— Brady Emerson

13
Chociaż powoduje to, że plik nie wyświetla się jako zmieniony podczas zatwierdzeń, takich jak .gitignore, w przeciwieństwie do plików ignorowanych, plik (i) nadal będą resetowane do wersji repo, jeśli wykonasz git reset --hard.
— Brady Emerson

19
Na stackoverflow.com/questions/23097368/... i stackoverflow.com/questions/13630849 /... skip-worktreeprawdopodobnie byłby preferowany assume-unchanged.
— danShumway

436

Aktualizacja : rozważ użycie git update-index --skip-worktree [<file>...]zamiast tego, dzięki @danShumway! Zobacz wyjaśnienie Borealid na temat różnicy między dwiema opcjami .


Stara odpowiedź:

Jeśli musisz zignorować lokalne zmiany w śledzonych plikach (mamy to z lokalnymi modyfikacjami plików konfiguracyjnych), użyj git update-index --assume-unchanged [<file>...].


8
Dla przypomnienia dodałem plik do $ GIT_DIR / info / exclude (np. My-file.php), a następnie musiałem uruchomić git update-index --assume-unchanged my-file.php, aby zaczął być ignorowany. Dzięki za wskazówkę!
— tollmanz

78
Aby cofnąć: git update-index --no-assume-unchanged my-file.php
— Ray

18
Tylko dla wyjaśnienia: załóżmy, że niezmienione dotyczy plików śledzonych (istnieje w repozytorium) ... OP poprosił o pliki nieśledzone, w którym .git/info/excludeto przypadku chcesz (aby uniknąć zanieczyszczenia często udostępnianego i śledzonego
— .gitignore

7
Według stackoverflow.com/questions/23097368/… jest to uważane za niebezpieczne, a twoje pliki mogą zostać zatwierdzone, jeśli nie będziesz ostrożny. Ma to na celu zwiększenie wydajności, a nie niezawodne rozwiązanie tego problemu.
— danShumway

3
Pobiegłem --assume-unchangedprzed przeczytaniem twojej aktualizacji . I rozwiązał się --no-assume-unchanged, a następnie zrobił --skip-worktree... Am I w jasne?
— Nicolas Miari,

162

Dodaj następujące wiersze do sekcji [alias] pliku .gitconfig

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Teraz możesz użyć, git ignore my_fileaby zignorować zmiany w pliku lokalnym i git unignore my_fileprzestać ignorować zmiany. git ignoredwyświetla zignorowane pliki.

Ta odpowiedź pochodzi z http://gitready.com/intermediate/2009/02/18/temporently-ignoring-files.html .


1
"! git ls-files -v | grep" ^ [[: lower:]] "- Czy wiesz, jak to zrobić na Windows cmd?
— Haohmaru

3
Zainstaluj prawdziwą powłokę (na przykład Babun zapewnia bash lub zsh);) Znam twoje uczucia, ale ostatnio przełączyłem się z Windowsa na Linuksa i nigdy więcej nie użyję cmd.
— Xerus

@Haohmaru, zawsze możesz użyć WSL (Windows Subsystem for Linux).
— A Sz

110

Masz kilka opcji:

  • Pozostaw brudny (lub niezatwierdzony) .gitignoreplik w swoim katalogu roboczym (lub zastosuj go automatycznie za pomocą programu topgit lub innego narzędzia do łatania).
  • Umieść wykluczenia w swoim $GIT_DIR/info/excludepliku, jeśli dotyczy to jednego drzewa.
  • Uruchom git config --global core.excludesfile ~/.gitignorei dodaj wzory do swojego ~/.gitignore. Ta opcja ma zastosowanie, jeśli chcesz zignorować określone wzory we wszystkich drzewach. Używam tego za .pyci .pyoplików, na przykład.

Upewnij się również, że używasz wzorców i nie wyliczasz jawnie plików, jeśli ma to zastosowanie.


10
Myślę, że musisz git config --globalustawić tę opcję globalnie.
— Josh Lee

7
Właściwie po prostu dodaj .gitignore do .gitignore;)!
— Dominik George,

68

Myślę, że szukasz:

git update-index --skip-worktree FILENAME

które ignorują zmiany wprowadzone lokalnie

Oto http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ więcej wyjaśnień na temat tego rozwiązania!

aby cofnąć użycie:

git update-index --no-skip-worktree FILENAME

9
Istnieje odpowiednia dyskusja pomiędzy tym pytaniem SO--skip-worktree i --assume-unchangedprzy nim
— Merwer

1
Jak mam to cofnąć lub zobaczyć listę plików / wzorców, które są obecnie ignorowane --skipworktree, czy powinienem później zmienić zdanie i chcieć ponownie rozpocząć śledzenie pliku?
— Anomalia

1
jak to cofnąć?
— user1735921,

3
Aby cofnąć, użyjgit update-index --no-skip-worktree <file>
— user1735921,

49

Możesz zainstalować niektóre aliasy git, aby uprościć ten proces. To edytuje [alias]węzeł twojego .gitconfigpliku.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Skróty, które to instaluje, są następujące:

  • git ignore config.xml
    • git będzie udawał, że nie widzi żadnych zmian config.xml- zapobiegając przypadkowemu zatwierdzeniu tych zmian.
  • git unignore config.xml
    • git wznowi potwierdzanie wprowadzonych zmian config.xml- umożliwiając ponowne zatwierdzenie tych zmian.
  • git ignored
    • git wyświetli listę wszystkich plików, które „ignorujesz” w sposób opisany powyżej.

Zbudowałem je, odwołując się do odpowiedzi Phatmanna - która przedstawia --assume-unchangedwersję tego samego.

Prezentowana wersja używa --skip-worktreedo ignorowania lokalnych zmian. Zobacz odpowiedź Borealid, aby uzyskać pełne wyjaśnienie różnicy, ale zasadniczo --skip-worktreecelem programistów jest zmiana plików bez ryzyka zatwierdzenia ich zmian .

git ignoredPolecenia przedstawiony tutaj używa git ls-files -v, i filtruje listę, aby wyświetlić tylko te wpisy rozpoczynające się od Stagu. STag oznacza plik, którego status jest „skip worktree”. Aby zobaczyć pełną listę statusów plików pokazanych przez git ls-files: patrz dokumentacja -topcji na git ls-files.


1
To nie działa dla nieśledzonych plików: <(git 2.13.5 na osx)
— Terra Ashley

Jest '!' miało być w '!git ls-files -v | grep "^S"'? Polecenie to nie działa dla mnie tam i wydaje się, że działa dobrze po usunięciu.
— Tiris,

wykrzyknik w aliasie git mówi gitowi, aby uruchomił zewnętrzne polecenie , a nie komendę git . Wstawiłem to, ponieważ potrzebuję potoku powłoki, więc muszę wywołać git z zewnątrz. Właśnie próbowałem usunąć wykrzyknik (zgodnie z Twoją rekomendacją), ale to nie działa dla mnie. I dostać Expansion of alias 'ignored' failed; 'git' is not a git command. To ma sens; bez wykrzyknika: git aliasy polecenia do git git ls-files ….
— Birchlabs,

Dziękuję za wyjaśnienie. Nie znam aliasu git i po prostu działałem w powłoce, aby przetestować przed utworzeniem aliasu.
— Tiris,

To wspaniałe rozwiązanie. Ponieważ git śledzi na katalog, po uruchomieniu powyższego aliasu git ignore <filename>dotyczy on tylko tego katalogu. A kiedy w końcu chcesz wprowadzić zmiany w tym pliku i zatwierdzić i przesłać zdalnie, po prostu skorzystaj z poręcznego narzędzia, git unignore <filename>aby tymczasowo zacząć go ponownie śledzić! Dzięki!
— nickang

42

Możesz po prostu dodać plik .gitignore do katalogu domowego, tj . $HOME/.gitignoreLub ~/.gitignore. Następnie powiedz gitowi, aby użył tego pliku z poleceniem:

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

Jest to normalny plik .gitignore, do którego git odwołuje się, podejmując decyzję, co zignorować. Ponieważ znajduje się w twoim katalogu domowym, dotyczy tylko ciebie i nie zanieczyszcza żadnych plików .gitignore projektu.

Stosuję to podejście od lat z doskonałymi wynikami.


Dzięki, @EricChen. Zaktualizowałem odpowiedź; spróbuj, a następnie użyj git check-ignore <file-name>do weryfikacji. LMK, jeśli to działa
— JESii,

Działa tylko dla mnie bez =:git config --global core.excludesfile ~/.gitignore
— E. Sundin

Umieściłem .gitignoreplik w katalogu domowym i powiedziałem gitowi, aby używał tego pliku, a następnie usunąłem pliki, które chciałbym wyśledzić lokalnie. Jednak po wprowadzeniu zmian zdalne repozytorium również usunęło te pliki. Czy zrobiłem coś złego?
— zyy

Wow, @xyz; .gitignorepolega na ignorowaniu plików znajdujących się w katalogu lokalnym. To, co powinieneś był zrobić, to git rm --cachedusuwa je z repozytorium, ale pozostawia w lokalnym. Powinieneś być w stanie wrócić do poprzedniego zatwierdzenia z czymś w rodzaju git reset --soft HEAD^cofnięcia zatwierdzenia i odzyskania plików. Na tym polega piękno git: wszystko jest nadal w twojej historii git.
— JESii

2

Aby zignorować nieśledzone pliki, zwłaszcza jeśli znajdują się one w (kilku) folderach, które nie są śledzone, prostym rozwiązaniem jest dodanie .gitignorepliku do każdego nieśledzonego folderu i wprowadzenie w jednym wierszu zawierającym *następujący wiersz. To naprawdę proste i proste rozwiązanie, jeśli nieśledzone pliki znajdują się w kilku folderach. Dla mnie wszystkie pliki pochodziły z jednego nieśledzonego folderu, vendora powyższe po prostu działało.


1
Świetny! FYI: Działa to tylko dlatego, że git śledzi (i pozwala zatwierdzać) pliki, a nie foldery.
— jmiserez

-2

Jeśli Twoje repozytorium nie ma jeszcze pliku .gitignore, prostym rozwiązaniem jest utworzenie pliku .gitignore, a następnie dodanie go .gitignoredo listy plików do zignorowania.


4
A co jeśli zespół zechce później dodać, aby dodać gitignore? Czy to w ogóle działa? Brzmi jak okropny pomysł i coś, co nawet nie powinno działać.
— Bjorn,

Odpowiedź tego faceta mnie zaskoczyła. Nie ma mowy, żeby ktokolwiek to robił.
— Martyn Chamberlin,

Jest to szybkie i proste rozwiązanie, o ile jest miejsce na jego umieszczenie. Nasze repo ma wspólny .gitignoreplik na górze. Ale moje brudne pliki znajdują się w głębokim folderze, więc właśnie dodałem własne .gitignore. +1
— joeytwiddle
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.