Ich habe lokale Änderungen an einer Datei, die ich nicht in mein Repository übertragen möchte. Es ist eine Konfigurationsdatei zum Erstellen der Anwendung auf einem Server, aber ich möchte lokal mit verschiedenen Einstellungen erstellen. Natürlich wird die Datei immer angezeigt, wenn ich 'git status' als etwas inszeniere. Ich möchte diese besondere Änderung verbergen und nicht begehen. Ich werde keine weiteren Änderungen an der Datei vornehmen.
Nach einigem Stöbern sehe ich zwei Optionen: 'unverändert annehmen' und 'Arbeitsbaum überspringen'. Eine frühere Frage hier spricht über sie, erklärt aber nicht wirklich ihre Unterschiede. Meine Frage lautet: Wie unterscheiden sich die beiden Befehle? Warum sollte jemand den einen oder anderen benutzen?
.gitignore
für ähnliche Zwecke. Würde diese Lösung für Sie funktionieren?Antworten:
Du willst
skip-worktree
.assume-unchanged
wurde für Fälle entwickelt, in denen es teuer ist, zu überprüfen, ob eine Gruppe von Dateien geändert wurde. Wenn Sie das Bit setzen, wirdgit
(natürlich) davon ausgegangen, dass die Dateien, die diesem Teil des Index entsprechen, in der Arbeitskopie nicht geändert wurden. So wird ein Durcheinander vonstat
Anrufen vermieden . Dieses Bit geht verloren, wenn sich der Eintrag der Datei im Index ändert (also wenn die Datei stromaufwärts geändert wird).skip-worktree
ist mehr als das: Selbst wenn bekannt istgit
, dass die Datei geändert wurde (oder durch einreset --hard
oder ähnliches geändert werden muss ), wird sie so tun, als ob dies nicht der Fall wäre, und stattdessen die Version aus dem Index verwenden. Dies bleibt so lange bestehen, bis der Index verworfen wird.Hier finden Sie eine gute Zusammenfassung der Auswirkungen dieses Unterschieds und der typischen Anwendungsfälle: http://fallengamer.livejournal.com/93321.html .
Aus diesem Artikel:
--assume-unchanged
geht davon aus, dass ein Entwickler eine Datei nicht ändern sollte . Dieses Flag dient zur Verbesserung der Leistung für nicht ändernde Ordner wie SDKs.--skip-worktree
ist nützlich, wenn Sie git anweisen, eine bestimmte Datei niemals zu berühren, da Entwickler sie ändern sollten . Wenn das Upstream-Haupt-Repository beispielsweise einige produktionsbereite Konfigurationsdateien hostet und Sie nicht versehentlich Änderungen an diesen Dateien vornehmen möchten,--skip-worktree
ist dies genau das, was Sie möchten.quelle
--skip-worktree
Effekte abzubrechen und das Flag zu deaktivieren, gibt es eine--no-skip-worktree
Option. Funktioniert genauso. Dies ist nützlich, wenn eine Hand ausgerutscht ist und falsche Dateien markiert wurden oder wenn sich die Umstände geändert haben und zuvor übersprungene Dateien nicht mehr ignoriert werden sollten.--skip-worktree
und der.git/info/exclude
Datei darin, dass die erstere auch für Dateien funktioniert, die derzeit verfolgt werden..git/info/exclude
, Wie.gitignore
, nur versehentlich untracked Dateien zum Index hinzugefügt verhindern, aber keine Änderungen an Dateien zu machen , die bereits verfolgt werden.git update-index --skip-worktree <file_name>
Hinweis: Fallengamer hat 2011 einige Tests durchgeführt (daher sind sie möglicherweise veraltet). Hier sind seine Ergebnisse :
Operationen
git pull
:Git behält die lokalen Änderungen trotzdem bei.
So würden Sie nicht versehentlich Daten verlieren, die Sie mit einem der Flags markiert haben.
assume-unchanged
Flag: Git würde die lokale Datei nicht überschreiben. Stattdessen werden Konflikte ausgegeben und Ratschläge zur Lösung dieser Konflikte gegebenskip-worktree
Flag: Git würde die lokale Datei nicht überschreiben. Stattdessen werden Konflikte ausgegeben und Ratschläge zur Lösung dieser Konflikte gegebengit stash
git pull
skip-worktree
assume-unchanged
Flag: Verwirft alle lokalen Änderungen, ohne dass eine Wiederherstellung möglich ist. Der Effekt ist wie 'git reset --hard
'. 'git pull
' Anruf wird erfolgreich seinskip-worktree
Flag: Stash würde beiskip-worktree
Dateien nicht funktionieren . 'git pull
' schlägt mit dem gleichen Fehler wie oben fehl. Der Entwickler muss dasskip-worktree
Flag manuell zurücksetzen , um den Fehler zu speichern und abzuschließenpull
.git pull
assume-unchanged
assume-unchanged
Flag: Inhalt wird aktualisiert, Flag geht verloren.'
git ls-files -v
' würde zeigen, dass das Flag inH
(vonh
) geändert wird .skip-worktree
Flag: Inhalt wird aktualisiert, Flag bleibt erhalten.'
git ls-files -v
' würde die gleicheS
Flagge wie vor dem zeigenpull
.git reset --hard
skip-worktree
assume-unchanged
assume-unchanged
Flag: Der Dateiinhalt wird zurückgesetzt. Flag wird aufH
(vonh
) zurückgesetzt.skip-worktree
Flag: Der Dateiinhalt ist intakt. Flagge bleibt gleich.Er fügt die folgende Analyse hinzu:
Es sieht aus wie
skip-worktree
ist sehr hart versuchen , Ihre lokalen Daten zu erhalten . Es hindert Sie jedoch nicht daran, vorgelagerte Änderungen vorzunehmen, wenn dies sicher ist. Außerdem setzt git das Flag nicht zurückpull
.Das Ignorieren des
reset --hard
Befehls ' ' könnte für einen Entwickler jedoch eine böse Überraschung sein .Assume-unchanged
Das Flag könnte bei derpull
Operation verloren gehen und die lokalen Änderungen in solchen Dateien scheinen für Git nicht wichtig zu sein.Sehen:
Junios (aktueller Git-Betreuer) Kommentar bezüglich der Absicht von
assume-unchanged
,Insbesondere weist Junio darauf hin , dass Änderungen an
assume-unchanged
Dateien aus Versehen begangen werden könnte: „Wenn Git einen Weg bestimmen kann , die als markiertassume-unchanged
hat sich verändert , ohne zu verursachen zusätzliche lstat (2) Kosten, es das Recht auf Bericht behält , dass der Pfad wurde geändert ( Infolgedessengit commit -a
ist es frei, diese Änderung zu übernehmen. "Unterschied zwischen
assume-unchanged
undskip-worktree
wie in der Git-Mailingliste beim Hinzufügen desskip-worktree
Patches beschrieben .Er kommt zu dem Schluss:
Eigentlich ist keine der Flags intuitiv genug .
assume-unchanged
geht davon aus, dass ein Entwickler eine Datei nicht ändern sollte. Wenn eine Datei geändert wurde, ist diese Änderung nicht wichtig. Dieses Flag dient zur Verbesserung der Leistung für nicht ändernde Ordner wie SDKs.Aber wenn das Versprechen gebrochen wird und eine Datei tatsächlich geändert wird, setzt git die Flagge zurück, um die Realität widerzuspiegeln. Wahrscheinlich ist es in Ordnung, einige inkonsistente Flags in Ordnern zu haben, die im Allgemeinen nicht geändert werden sollen.
Auf der anderen Seite
skip-worktree
ist es nützlich, wenn Sie git anweisen, niemals eine bestimmte Datei zu berühren. Dies ist nützlich für eine bereits verfolgte Konfigurationsdatei.Das Upstream-Hauptrepository enthält einige produktionsbereite Konfigurationen, Sie möchten jedoch einige Einstellungen in der Konfiguration ändern, um lokale Tests durchführen zu können. Und Sie möchten nicht versehentlich die Änderungen in einer solchen Datei überprüfen, um die Produktionskonfiguration zu beeinflussen. In diesem Fall
skip-worktree
macht perfekte Szene.Mit Git 2.25.1 (Februar 2020) wird das oben erwähnte "Eigentlich ist keines der Flags intuitiv genug" weiter verdeutlicht:
Siehe Commit 7a2dc95 , Commit 1b13e90 (22. Januar 2020) von Brian M. Carlson (
bk2204
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 53a8329 , 30. Januar 2020)( Git-Mailingliste )
Die
git update-index
Manpage enthält jetzt:In diesem letzten Teil beschreibe ich einen typischen Inhaltsfiltertreiber, der auf Smudge / Clean-Skripten basiert .
quelle