Rückgängig machen git update-index --skip-worktree

148

Vor einiger Zeit habe ich dies getan, um Änderungen an einer von git verfolgten Datei zu ignorieren:

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

Jetzt möchte ich tatsächlich Änderungen an dieser Datei in die Quelle übernehmen. Wie mache ich die Auswirkungen von rückgängig skip-worktree?

Kevin Burke
quelle
11
Ich bin auch daran interessiert, wie man eine Liste von Dateien im Status "Arbeitsbaum überspringen" erhält.
Troex

Antworten:

202

Aha! Ich möchte einfach:

git update-index --no-skip-worktree <file>
Kevin Burke
quelle
8
Ich liebe die Aha!
Ruto Collins
1
wer hätte es
gedacht
1
Aha! = Eurika! : D
Daut
Ich hätte das erfinden können!
Tom Padilla
Warum ist die beste Antwort am Ende der Seite
Carl Kroeger Ihl
34

Verwenden Sie laut http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html

git ls-files -v

um die mit einem Sonderbuchstaben gekennzeichneten Dateien "unverändert annehmen" und "Arbeitsbaum überspringen" anzuzeigen. Die "skip-worktree" -Dateien sind mit gekennzeichnet S.

Bearbeiten : Wie @amacleod bereits erwähnt hat, ist es ein guter Trick , einen Alias ​​zum Auflisten aller versteckten Dateien zu erstellen , damit Sie sich nicht daran erinnern müssen. Ich benutze alias hidden="git ls-files -v | grep '^S'"in meinem .bash_profile. Es funktioniert super!

Stefan Anca
quelle
9
Ordentlich. Ich kann git ls-files -v | grep '^S'nur Dateien auflisten, die ich mit skip-worktree "versteckt" habe. Ich hoffte, einen Alias ​​für diesen Befehl "versteckt" zu machen, aber das Einfügen einer Pipe-Umleitung in den Alias ​​schien nicht zu funktionieren.
Amacleod
5
@amacleod benutze a !. So [alias] ignored = !git ls-files -v | grep "^S"funktioniert Getestet.
Steven Lu
@amacleod Nehmen Sie nicht an, Sie könnten einen alternativen Befehl für Windows vorschlagen?
Steve Chambers
1
@SteveChambers, Kurz vor der Installation grepweiß ich nicht. Kommt auf deine Muschel an, denke ich. Git Bash kommt mit grep, denke ich.
Amacleod
1
Genial, danke @amacleod - war mir einfach nicht im Weg. Das einzige, was ich ändern musste, damit dies unter Windows funktioniert, war der Anführungszeichenstil - 'funktionierte nicht, "tat es aber, dhgit ls-files -v | grep "^S"
Steve Chambers
17

Wenn Sie alle angewendeten Dateien rückgängig machen möchten, können Sie den folgenden Befehl verwenden:

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 druckt alle Dateien mit ihrem Status
  2. grep -i ^S filtert Dateien und wählt nur Arbeitsbaum (S) überspringen oder Arbeitsbaum überspringen aus und nimmt unveränderte (n) an. -i bedeutet, Groß- und Kleinschreibung ignorieren
  3. cut -c 3- Entfernt den Status und lässt nur Pfade übrig, wobei vom 3. Zeichen bis zum Ende geschnitten wird
  4. tr '\012' '\000' ersetzt das Zeilenendezeichen (\ 012) durch das Nullzeichen (\ 000)
  5. xargs -0 git update-index --no-skip-worktreeÜbergibt alle durch Null getrennten Pfade an, git update-index --no-skip-worktreeum rückgängig zu machen
C0DEF52
quelle
1
Dies ist die beste Antwort
Dev
Diese Antwort ist reines Gold!
Yossico
7

Basierend auf der @ GuidC0DE-Antwort ist hier eine Version für Powershell (ich benutze posh-git )

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

Und als Referenz auch den entgegengesetzten Befehl zum Ausblenden der Dateien:

git update-index --skip-worktree $(git ls-files --modified)
eXavier
quelle
3

Für diejenigen, die Tortoise Git verwenden:

  1. Klicken Sie mit der rechten Maustaste auf den Ordner oder auf die jeweilige Datei und wählen Sie dann TortoiseGit > Check for modifications
  2. Nur prüfen Show ignore local changes flagged files. Sie sollten die Datei sehen, die Sie ignoriert haben (oder alle Dateien, die Sie ignoriert haben, wenn Sie mit der rechten Maustaste auf den Ordner geklickt haben).
  3. Klicken Sie mit der rechten Maustaste auf die Datei und wählen Sie Unflag as skip-worktree and assume-unchanged
user276648
quelle
3

Für alle, die Bash-Aliase lieben, ist hier mein Set, um sie alle zu regieren (basierend auf 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
quelle