Cofnij git update-index --skip-workktree

148

Jakiś czas temu zrobiłem to, aby zignorować zmiany w pliku śledzonym przez git:

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

Teraz faktycznie chcę zatwierdzić zmiany w tym pliku do źródła. Jak cofnąć skutki programu skip-worktree?

Kevin Burke
źródło
11
Interesuje mnie również, jak uzyskać listę plików w stanie „pomiń obszar roboczy”?
troex

Odpowiedzi:

202

Aha! Po prostu chcę:

git update-index --no-skip-worktree <file>
Kevin Burke
źródło
8
Uwielbiam Aha!
Ruto Collins
1
kto by to
wziął
1
Aha! = Eurika! : D
Daut
Mogłem to wymyślić!
Tom Padilla
Dlaczego najlepsza odpowiedź na dole strony
Carl Kroeger Ihl
35

Zgodnie z http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html użyj

git ls-files -v

aby zobaczyć pliki "zakładaj niezmienione" i "pomiń obszar roboczy" oznaczone specjalną literą. Pliki „skip-workktree” są oznaczone S.

Edycja : jak wspomniał @amacleod , utworzenie aliasu do listy wszystkich ukrytych plików jest fajną sztuczką, abyś nie musiał go pamiętać. Używam alias hidden="git ls-files -v | grep '^S'"w moim .bash_profile. Działa świetnie!

Stefan Anca
źródło
9
Schludny. Mogę użyć git ls-files -v | grep '^S'do wyświetlenia tylko plików, które zostały „ukryte” za pomocą skip-worktree. Miałem nadzieję, że alias zostanie „ukryty” dla tego polecenia, ale umieszczenie przekierowania potoku w aliasie wydawało się nie działać.
amacleod
5
@amacleod użyj pliku !. Jak ten [alias] ignored = !git ls-files -v | grep "^S"Testowany, działa.
Steven Lu
@amacleod Nie myśl, że byłbyś w stanie zasugerować alternatywne polecenie dla systemu Windows?
Steve Chambers
1
@SteveChambers, Krótko o instalacji grep, nie wiem. Chyba zależy od twojej powłoki. grepMyślę, że Git Bash jest dostępny .
amacleod
1
Świetnie, dzięki @amacleod - po prostu nie było mi na drodze. Jedyną rzeczą, którą musiałem zmienić, aby to działało w systemie Windows, był styl cytowania - 'nie działał, ale działał ", tj.git ls-files -v | grep "^S"
Steve Chambers
17

Jeśli chcesz cofnąć wszystkie zastosowane pliki, pomiń obszar roboczy, możesz użyć następującego polecenia:

git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
  1. git ls-files -v wydrukuje wszystkie pliki wraz ze stanem
  2. grep -i ^S przefiltruje pliki i wybierze tylko pomiń drzewo robocze (S) lub pominie drzewo robocze i przyjmie bez zmian, -i oznacza ignorowanie wielkości liter
  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 znak zera (\ 000)
  5. xargs -0 git update-index --no-skip-worktreebędzie przekazywać wszystkie ścieżki oddzielone znakiem zero, git update-index --no-skip-worktreeaby cofnąć
C0DEF52
źródło
1
To najlepsza odpowiedź
Dev
Ta odpowiedź to czyste złoto!
yossico
7

Na podstawie odpowiedzi @ GuidC0DE, oto wersja dla Powershell (używam posh-git )

git update-index --no-skip-worktree $(git ls-files -v | sls -pattern "^S"| %{$_.Line.Substring(2)})

A dla odniesienia również przeciwne polecenie, aby ukryć pliki:

git update-index --skip-worktree $(git ls-files --modified)
eXavier
źródło
3

Dla tych, którzy używają Tortoise Git:

  1. Kliknij prawym przyciskiem myszy folder lub określony plik, a następnie wybierz TortoiseGit > Check for modifications
  2. Tylko sprawdź Show ignore local changes flagged files. Powinieneś zobaczyć plik, który zignorowałeś (lub wszystkie pliki, które zignorowałeś, jeśli kliknąłeś folder prawym przyciskiem myszy)
  3. Kliknij plik prawym przyciskiem myszy i wybierz Unflag as skip-worktree and assume-unchanged
user276648
źródło
3

Dla wszystkich, którzy kochają aliasy Bash, oto mój zestaw do rządzenia nimi wszystkimi (oparty na C0DEF52)

alias gitskip='git update-index --skip-worktree ' #path to file(s)
alias gitlistskiped='git ls-files -v | grep ^S'
alias gitunskip='git update-index --no-skip-worktree ' #path to file(s)
alias gitunskipall='git ls-files -v | grep -i ^S | cut -c 3- | tr ''\\012'' ''\\000'' | xargs -0 git update-index --no-skip-worktree'
yossico
źródło
0

Ta odpowiedź jest skierowana do osób mniej technicznych korzystających z systemu Windows.

Jeśli nie pamiętasz / nie wiesz, na które pliki kliknąłeś „skip-workktree”, użyj:

git ls-files -v             //This will list all files, you are looking for the ones with an S at the beginning of the line. 

git ls-files -v | grep "S " //Use this to show only the lines of interest. Those are the files that have "skip-worktree".

Aby rozwiązać problem:

Możesz przejść do plików -> kliknij prawym przyciskiem myszy -> przywróć poprzednią wersję -> kliknij zakładkę „git” na górze -> odznacz pole wyboru „skip-workktree” -> kliknij „Apply” na dole.

Jeśli plików jest zbyt wiele, aby można je było naprawić ręcznie, należy zapoznać się z innymi odpowiedziami.

Bojidar Stanchev
źródło