Rückgängig machen git update-index --assume-unverändert <Datei>

462

Die Art und Weise, wie Sie das Beobachten / Verfolgen eines bestimmten Verzeichnisses / einer bestimmten Datei ignorieren. Sie führen einfach Folgendes aus:

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

Wie machst du es nun rückgängig, damit sie wieder beobachtet werden? (Nennen wir es nicht angenommen.)

Adardesign
quelle
5
Nur eine Anmerkung, um zu sagen, dass es den Anschein hat, dass Skip-Worktree höchstwahrscheinlich das ist, was Sie besser verwenden würden, als unverändert anzunehmen, es sei denn, die Leistung von Git ist Ihr Problem. stackoverflow.com/questions/13630849/…
GreenAsJade

Antworten:

587

Führen Sie Folgendes aus, um die / Dateien des Verzeichnisses rückgängig zu machen / anzuzeigen, die auf unverändert gesetzt sind :

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

So erhalten Sie eine Liste der Verzeichnisse / Dateien, die assume-unchangedausgeführt werden :

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

Adardesign
quelle
7
Eine geringfügige Verbesserung Ihrer grep-Anweisung könnte '^ [az]' verwenden, um alle ignorierten Dateien abzufangen, da das erste Buchstaben-Tag andere Buchstaben als 'H' / 'h' sein könnte. Von git-scm.com/docs/git-ls-files : Diese Option identifiziert den Dateistatus mit den folgenden Tags (gefolgt von einem Leerzeichen) am Anfang jeder Zeile: H :: zwischengespeicherter S :: skip-worktree M: : unmerged R :: entfernt / gelöscht C :: geändert / geändert K :: getötet werden? :: other
Bdoserror
8
Ein weiterer nützlicher Trick ist git ls-files -v|grep '^h'|cut -c3-, dass Sie nur die Dateinamen ohne das Präfix "h" erhalten.
Retsam
9
Wenn Sie die Dateien, die Sie verwenden assume-unchanged, nicht mehr kennen, verwenden Sie einfach git update-index --really-refresh. Mit diesem Befehl müssen Sie nicht zuerst nach den Dateien suchen git ls-files.
theDmi
102

Wenn dies ein Befehl ist, den Sie häufig verwenden, sollten Sie auch einen Alias ​​dafür in Betracht ziehen. Fügen Sie Ihrem globalen hinzu .gitconfig:

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

So legen Sie einen Alias ​​fest (falls Sie es noch nicht wissen):

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

Beispiel:

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

Nachdem Sie dies in Ihrem gespeichert haben .gitconfig, können Sie einen Cleaner-Befehl ausführen.

git hide myfile.ext

oder

git unhide myfile.ext

Diese Git-Dokumentation war sehr hilfreich.

Laut den Kommentaren ist dies auch ein hilfreicher Alias, um herauszufinden, welche Dateien derzeit versteckt sind:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-
adswebwork
quelle
2
Dieser Alias ​​ist auch praktisch:hidden = ! git ls-files -v | grep '^h' | cut -c3-
Seanf
42

Die Funktion git update-index bietet mehrere Optionen, die Sie wie folgt eingeben können:

git update-index --help

Hier finden Sie verschiedene Möglichkeiten - wie man mit der Funktion update-index umgeht.

[wenn Sie den Dateinamen nicht kennen]

git update-index --really-refresh 

[wenn Sie den Dateinamen kennen]

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

setzt alle Dateien zurück, die in der Ignorierliste hinzugefügt wurden.

git update-index --assume-unchanged <file>
Ankit Vishwakarma
quelle
Git Update-Index - wirklich-aktualisieren, alle angenommen-unverändert, die ich gemacht habe, rückgängig machen, danke für den Tipp
Sérgio
git update-index --no-assume-unchanged <file>hat mein Leben gerettet .. ok, ich konnte den Ordner einfach wieder synchronisieren, aber ich wollte eine "echte" Lösung für dieses Problem.
Cagatay Ulubay
38

Ich nehme an (heh) du meintest --assume-unchanged, da ich keine --assume-changedOption sehe . Die Umkehrung von --assume-unchangedist --no-assume-unchanged.

Hobbs
quelle
32

Um die hervorragenden Originalantworten von @adardesign, @adswebwork und @AnkitVishwakarma sowie die Kommentare von @Bdoserror, @Retsam, @seanf und @torek mit zusätzlichen Dokumentationslinks und präzisen Aliasnamen zusammenzufassen ...

Grundlegende Befehle

So setzen Sie eine Datei zurück , die unverändert wieder normal ist:

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

So listen Sie alle Dateien auf, die unverändert bleiben:

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

So setzen Sie alle angenommenen unveränderten Dateien wieder auf den Normalwert zurück:

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

Hinweis: Dieser Befehl, der an anderer Stelle aufgeführt wurde, scheint nicht mehr alle angenommenen unveränderten Dateien zurückzusetzen (ich glaube, er wurde früher verwendet und zuvor als Lösung aufgeführt):

git update-index --really-refresh

Verknüpfungen

Fügen Sie den folgenden Alias- Abschnitt .gitconfigfür Ihren Benutzer hinzu (z. B. ~/.gitconfigauf einem * nix- oder macOS-System) , um die Ausführung dieser allgemeinen Aufgaben in git zu vereinfachen.

[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
quelle
1
Denn git hiddenSie können den gleichen Effekt ohne Shell-Aliase oder Skripte erzielen, indem Sie !hidden = ! git ls-files -v | grep '^h' | cut -c3-
Folgendes verwenden
1
--really-refreshlöscht die angenommenen unveränderten Flags in Indexdateien nicht (oder nicht mehr, vielleicht einmal).
Torek
Vielen Dank, @torek! Ich habe das von Ihnen beschriebene Verhalten bestätigt und die Antwort mit einer anderen Lösung für den Fall "Alle zurücksetzen" aktualisiert.
Will Cain
20

Wenn Sie alle angewendeten Dateien rückgängig machen möchten, nehmen Sie an, dass sie mit einem beliebigen Status unverändert und nicht nur zwischengespeichert sind (git markiert sie in Kleinbuchstaben durch Zeichen), und verwenden den folgenden Befehl:

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 druckt alle Dateien mit ihrem Status
  2. grep '^[a-z]' filtert Dateien und wählt nur unverändert aus
  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-assume-unchangedÜbergibt alle durch Null getrennten Pfade an, git update-index --no-assume-unchangedum rückgängig zu machen
C0DEF52
quelle
Das ist so nützlich. Danke für die detaillierten Informationen!
Chamithra Thenuwara
11

Wenn @adardesignSie die Antwort hinzufügen möchten , können Sie Folgendes tun , wenn Sie alle Dateien, die zur assume-unchangedListe hinzugefügt wurden, auf einmal zurücksetzen möchten no-assume-unchanged:

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

Dadurch werden nur die beiden von grep ausgegebenen Zeichen entfernt, dh "h "Leerzeichen, die möglicherweise in Dateinamen vorhanden sind, werden entfernt, und schließlich || truewird verhindert, dass der Befehl vorzeitig beendet wird, falls einige Dateien in der Schleife Fehler aufweisen.

Sagunmen
quelle
4

Wenn Sie Git Extensions verwenden , führen Sie die folgenden Schritte aus:

  1. Gehen Sie zum Festschreibungsfenster.
  2. Klicken Sie auf die Dropdown-Liste Arbeitsverzeichnisänderungen .
  3. Wählen Sie die Option Angenommene unveränderte Dateien anzeigen .
  4. Klicken Sie mit der rechten Maustaste auf die Datei, die Sie entfernen möchten.
  5. Wählen Sie Nicht unverändert annehmen .

Du bist fertig.

Shivang Gupta
quelle
0

Nichts hier, was nicht abgedeckt ist. Möchte aber meine 2 Cent hinzufügen. Manchmal führe ich einen Build aus und er ändert viele Dateien und dann möchte ich an etwas arbeiten, daher hilft mir dieser Befehl sehr.

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

Hoffe, jemand anderes findet es auch nützlich.

Tyagi Akhilesh
quelle
Ich denke, Sie würden davon profitieren, wenn Sie .gitignoreIhre Build-Artefakte ignorieren würden .
Nick
1
Ich habe .gitignoreaber das ist manchmal, meiner Erfahrung nach nicht ausreichend. Aber ich verstehe den Kontext, in dem Sie dies sagen.
Tyagi Akhilesh
0

Keine der Lösungen funktionierte für mich in Windows - es scheint Heher Großbuchstaben als hfür den Dateistatus zu verwenden, und der Befehl grep erfordert ein zusätzliches Caret, das ^auch den Zeilenanfang darstellt und das nächste Zeichen negiert.

Windows-Lösung

  1. Öffnen Sie Git Bash und wechseln Sie in das entsprechende Verzeichnis der obersten Ebene.
  2. git ls-files -v | grep '^^H' um alle nicht zwischengespeicherten Dateien aufzulisten
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree um das Überspringen aller Dateien rückgängig zu machen, die über ausgeführt wurden 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 um das Überspringen aller Dateien rückgängig zu machen, die über ausgeführt wurden update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' um alle nicht zwischengespeicherten Dateien erneut aufzulisten und zu überprüfen, ob die oben genannten Befehle funktioniert haben - dies sollte jetzt nichts zurückgeben
Steve Chambers
quelle
-1

Wenn Sie Eclipse verwenden, kann Folgendes hilfreich sein:

Nein, bei Eclipse unverändert annehmen

Antonio
quelle
1
Warum bitte die Abstimmungen?
Antonio