Cofnij git update-index --assume-unchanged <plik>

462

Sposób, w jaki Git ignoruje oglądanie / śledzenie określonego katalogu / pliku. po prostu uruchom to:

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

Jak to cofnąć, aby można je było oglądać ponownie? (Nazwijmy to nieprzyjęciem).

adardesign
źródło
5
Tylko uwaga, by powiedzieć, że wydaje się, że najprawdopodobniej lepiej byłoby użyć pominięcia-drzewa roboczego, niż zakładać niezmienione, chyba że problemem jest wydajność git. stackoverflow.com/questions/13630849/…
GreenAsJade

Odpowiedzi:

587

Aby uzyskać cofnięcie / pokaż katalog / pliki, które są ustawione na przyjęcie niezmienionej, uruchom to :

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

Aby uzyskać listę plików / katalogów, które są assume-unchangeduruchamiane :

git ls-files -v|grep '^h'

adardesign
źródło
7
Niewielkie ulepszenie instrukcji grep, można użyć „^ [az]” do przechwycenia wszystkich ignorowanych plików, ponieważ znacznikiem pierwszej litery mogą być litery inne niż „H” / „h”. Z git-scm.com/docs/git-ls-files : Ta opcja identyfikuje status pliku za pomocą następujących znaczników (po których następuje spacja) na początku każdej linii: H :: cached S :: skip-worktree M: : unmerged R :: usunięto / usunięto C :: zmodyfikowano / zmieniono K :: do zabicia? :: inne
Bdoserror
8
Kolejną przydatną sztuczką jest git ls-files -v|grep '^h'|cut -c3-, która da ci tylko nazwy plików, bez prefiksu „h”.
Retsam
9
Jeśli nie znasz już plików, których używasz assume-unchanged, po prostu użyj git update-index --really-refresh. Dzięki temu poleceniu nie musisz git ls-filesnajpierw szukać plików .
theDmi
102

Jeśli jest to polecenie, którego często używasz - możesz również rozważyć użycie dla niego aliasu. Dodaj do swojej globalnej .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Jak ustawić alias (jeśli jeszcze tego nie wiesz):

git config --configLocation alias.aliasName 'command --options'

Przykład:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Po zapisaniu tego w swoim .gitconfigpliku możesz uruchomić czystsze polecenie.

git hide myfile.ext

lub

git unhide myfile.ext

Ta dokumentacja git była bardzo pomocna.

Zgodnie z komentarzami jest to również pomocny alias, aby dowiedzieć się, jakie pliki są obecnie ukryte:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-
sieć reklamowa
źródło
2
Ten alias jest również przydatny:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf
42

git update-index ma kilka opcji, które możesz wpisać poniżej:

git update-index --help

Tutaj znajdziesz różne opcje - jak obsługiwać za pomocą funkcji update-index.

[jeśli nie znasz nazwy pliku]

git update-index --really-refresh 

[jeśli znasz nazwę pliku]

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

przywróci wszystkie pliki, które zostały dodane do listy ignorowanych przez.

git update-index --assume-unchanged <file>
Ankit Vishwakarma
źródło
git update-index - naprawdę odśwież, cofnij wszystkie założenia - niezmienione, które zrobiłem, dzięki za podpowiedź
Sérgio
git update-index --no-assume-unchanged <file>uratowałem moje życie .. OK, mógłbym ponownie zsynchronizować folder, ale chciałem „prawdziwego” rozwiązania tego problemu.
Cagatay Ulubay
38

Zakładam (heh) miałeś na myśli --assume-unchanged, ponieważ nie widzę żadnej --assume-changedopcji. Odwrotnością --assume-unchangedjest --no-assume-unchanged.

Hobbs
źródło
32

Aby zsyntetyzować doskonałe oryginalne odpowiedzi od @adardesign, @adswebwork i @AnkitVishwakarma oraz komentarze od @Bdoserror, @Retsam, @seanf i @torek, z dodatkowymi linkami do dokumentacji i zwięzłymi aliasami ...

Podstawowe polecenia

Aby zresetować plik, który nie został zmieniony z powrotem na normalny:

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

Aby wyświetlić listę wszystkich plików, które są niezmienione:

git ls-files -v | grep '^[a-z]' | cut -c3-

Aby zresetować wszystkie niezmienione pliki z powrotem do normalnego:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Uwaga: To polecenie, które zostało wymienione gdzie indziej, nie wydaje się już resetować wszystkich plików zakładanych bez zmian (myślę, że kiedyś to poprzedziło i jako rozwiązanie):

git update-index --really-refresh

Skróty

Aby ułatwić wykonywanie tych typowych zadań w git, dodaj / zaktualizuj następującą sekcję aliasów.gitconfig dla swojego użytkownika (np. W ~/.gitconfigsystemie * nix lub macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-
Will Cain
źródło
1
Bo git hiddenmożesz osiągnąć ten sam efekt bez aliasów powłoki i skryptów, używając w !ten sposób:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf
1
--really-refreshnie usuwa (lub już nie usuwa, być może kiedyś to usunęło) flag zakładających niezmienione flagi w plikach indeksu.
torek
Dziękuję, @torek! Potwierdziłem opisane zachowanie i zaktualizowałem odpowiedź, wprowadzając inne rozwiązanie w sprawie „zresetuj wszystko”.
Will Cain
20

Jeśli chcesz cofnąć wszystkie zastosowane pliki, zakładając niezmienione, o dowolnym statusie, nie tylko buforowane (git zaznacza je znakami małymi literami), możesz użyć następującego polecenia:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v wydrukuje wszystkie pliki z ich statusem
  2. grep '^[a-z]' będzie filtrować pliki i zaznaczać tylko zakładając niezmienione
  3. cut -c 3- usunie status i pozostawi tylko ścieżki, odcinając od trzeciego znaku do końca
  4. tr '\012' '\000' zamieni znak końca linii (\ 012) na zero (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedprzejdzie wszystkie ścieżki oddzielone znakiem zero, git update-index --no-assume-unchangedaby cofnąć
C0DEF52
źródło
To jest bardzo przydatne. Dzięki za szczegółowe informacje!
Chamithra Thenuwara
11

Dodając do @adardesignodpowiedzi, jeśli chcesz zresetować wszystkie pliki, które zostały dodane do assume-unchangedlisty za no-assume-unchangedjednym razem, możesz wykonać następujące czynności:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Spowoduje to po prostu usunięcie dwóch znaków wyjściowych z grep, tj. "h "Następnie ucieczkę ze spacji, które mogą występować w nazwach plików, a na koniec || truezapobiegnie przedwczesnemu zakończeniu polecenia w przypadku, gdy niektóre pliki w pętli zawierają błędy.

sagunms
źródło
4

Jeśli używasz rozszerzeń Git , wykonaj następujące kroki:

  1. Przejdź do okna zatwierdzania.
  2. Kliknij menu rozwijane o nazwie Zmiany katalogu roboczego .
  3. Wybierz opcję Pokaż przypięte niezmienione pliki .
  4. Kliknij prawym przyciskiem myszy plik, który chcesz cofnąć.
  5. Wybierz opcję Nie zakładaj bez zmian .

Gotowe.

Shivang Gupta
źródło
0

Nic tu nie jest objęte. Ale chciałbym dodać moje 2 centy. Czasami uruchamiam kompilację, która zmienia wiele plików, a potem chcę nad czymś popracować, więc to polecenie naprawdę mi bardzo pomaga.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Mam nadzieję, że ktoś inny uzna to za przydatne.

Tyagi Akhilesh
źródło
Myślę, że skorzystasz z .gitignoreignorowania artefaktów kompilacji.
Nick
1
Mam, .gitignoreale to jest czasami, z mojego doświadczenia nie jest wystarczające. Ale rozumiem kontekst, w którym to mówisz.
Tyagi Akhilesh
0

Żadne z rozwiązań nie działało dla mnie w systemie Windows - wydaje się, że używa ono kapitału, Ha nie hstatusu pliku, a polecenie grep wymaga dodatkowej karetki, ponieważ ^reprezentuje także początek linii, a także neguje następny znak.

Rozwiązanie Windows

  1. Otwórz Git Bash i przejdź do odpowiedniego katalogu najwyższego poziomu.
  2. git ls-files -v | grep '^^H' aby wyświetlić listę wszystkich niebuforowanych plików
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree aby cofnąć pomijanie wszystkich plików wykonanych za pomocą update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged aby cofnąć pomijanie wszystkich plików wykonanych za pomocą update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' aby ponownie wyświetlić listę wszystkich niebuforowanych plików i sprawdzić, czy powyższe polecenia zadziałały - nie powinno to teraz niczego zwracać
Steve Chambers
źródło
-1

Jeśli korzystasz z Eclipse, przydatne mogą być:

nie zakładaj niezmienionego zaćmienia

Antonio
źródło
1
dlaczego proszę o opinie?
Antonio