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.

Bjorn
źródło

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>
Josh Lee
źródło
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>...].

Florian Sesser
źródło
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 .

phatmann
źródło
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.

Emil Sit
źródło
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
Piotr Korlaga
źródło
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.

Brzozy
źródło
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.

JESii
źródło
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.

aak318
źródł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.

Gavin S. Yancey
źródło
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