Hinweis: Fallengamer hat 2011 einige Tests durchgeführt (daher sind sie möglicherweise veraltet). Hier sind seine Ergebnisse :
Operationen
- Die Datei wird sowohl im lokalen Repository als auch im Upstream geändert
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.
- Datei mit
assume-unchanged
Flag: Git würde die lokale Datei nicht überschreiben. Stattdessen werden Konflikte ausgegeben und Ratschläge zur Lösung dieser Konflikte gegeben
- Datei mit
skip-worktree
Flag: Git würde die lokale Datei nicht überschreiben. Stattdessen werden Konflikte ausgegeben und Ratschläge zur Lösung dieser Konflikte gegeben
- Die Datei ist sowohl im lokalen Repository geändert und Upstream, versucht irgendwie zu ziehen
Verwendung Ergebnisse in einiger zusätzlichen Handarbeit , aber zumindest würden Sie keine Daten verlieren , wenn Sie alle lokalen Änderungen haben.
git stash
git pull
skip-worktree
- Datei mit
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 sein
- Datei mit
skip-worktree
Flag: Stash würde bei skip-worktree
Dateien nicht funktionieren . ' git pull
' schlägt mit dem gleichen Fehler wie oben fehl. Der Entwickler muss das skip-worktree
Flag manuell zurücksetzen , um den Fehler zu speichern und abzuschließen pull
.
- Keine lokalen Änderungen, Upstream-Datei geändert
Beide Flags würden Sie nicht daran hindern, Upstream-Änderungen zu erhalten. Git erkennt, dass Sie das Versprechen gebrochen haben , und entscheidet sich dafür, die Realität widerzuspiegeln, indem Sie die Flagge zurücksetzen.
git pull
assume-unchanged
- Datei mit
assume-unchanged
Flag: Inhalt wird aktualisiert, Flag geht verloren.
' git ls-files -v
' würde zeigen, dass das Flag in H
(von h
) geändert wird .
- Datei mit
skip-worktree
Flag: Inhalt wird aktualisiert, Flag bleibt erhalten.
' git ls-files -v
' würde die gleiche S
Flagge wie vor dem zeigen pull
.
- Wenn die lokale Datei geändert wurde,
berührt Git die Datei nicht und spiegelt die Realität (die Datei, die versprochen wurde, unverändert zu sein, wurde tatsächlich geändert) für die Datei wider .
git reset --hard
skip-worktree
assume-unchanged
- Datei mit
assume-unchanged
Flag: Der Dateiinhalt wird zurückgesetzt. Flag wird auf H
(von h
) zurückgesetzt.
- Datei mit
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ück pull
.
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 der pull
Operation verloren gehen und die lokalen Änderungen in solchen Dateien scheinen für Git nicht wichtig zu sein.
Sehen:
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 )
doc
: Benutzer davon abhalten, verfolgte Dateien zu ignorieren
Abgemeldet von: Jeff King
Abgemeldet von: brian m. Carlson
Es ist durchaus üblich, dass Benutzer die Änderungen an einer Datei, die Git verfolgt, ignorieren möchten.
Häufige Szenarien für diesen Fall sind IDE-Einstellungen und Konfigurationsdateien, die im Allgemeinen nicht nachverfolgt und möglicherweise mithilfe eines Vorlagenmechanismus aus nachverfolgten Dateien generiert werden sollten.
Benutzer lernen jedoch die Bits "Annahme unverändert" und "Arbeitsbaum überspringen" kennen und versuchen, sie trotzdem zu verwenden.
Dies ist problematisch, da sich viele Operationen beim Setzen dieser Bits wie vom Benutzer erwartet verhalten, aber normalerweise nicht helfen, wenn git checkout
eine Datei ersetzt werden muss.
In diesem Fall gibt es kein vernünftiges Verhalten, da die Daten manchmal wertvoll sind, z. B. bestimmte Konfigurationsdateien, und manchmal irrelevante Daten, die der Benutzer gerne verwerfen würde.
Da dies keine unterstützte Konfiguration ist und Benutzer dazu neigen, die vorhandenen Funktionen für unbeabsichtigte Zwecke zu missbrauchen, was zu allgemeiner Trauer und Verwirrung führt, dokumentieren wir das vorhandene Verhalten und die Fallstricke in der Dokumentation, git update-index
damit Benutzer wissen, dass sie nach alternativen Lösungen suchen sollten.
Lassen Sie uns außerdem eine empfohlene Lösung für den allgemeinen Fall von Konfigurationsdateien bereitstellen, da bekannte Ansätze in vielen Umgebungen erfolgreich eingesetzt werden.
Die git update-index
Manpage enthält jetzt:
Benutzer versuchen häufig, die assume-unchanged
und skip-worktree
-Bits zu verwenden, um Git anzuweisen, Änderungen an nachverfolgten Dateien zu ignorieren. Dies funktioniert nicht wie erwartet, da Git bei bestimmten Vorgängen möglicherweise weiterhin Arbeitsbaumdateien anhand des Index überprüft. Im Allgemeinen bietet Git keine Möglichkeit, Änderungen an nachverfolgten Dateien zu ignorieren. Daher werden alternative Lösungen empfohlen.
Wenn es sich bei der zu ändernden Datei beispielsweise um eine Art Konfigurationsdatei handelt, kann das Repository eine Beispielkonfigurationsdatei enthalten, die dann in den ignorierten Namen kopiert und geändert werden kann. Das Repository kann sogar ein Skript enthalten, mit dem die Beispieldatei als Vorlage behandelt und automatisch geändert und kopiert wird.
In diesem letzten Teil beschreibe ich einen typischen Inhaltsfiltertreiber, der auf Smudge / Clean-Skripten basiert .
.gitignore
für ähnliche Zwecke. Würde diese Lösung für Sie funktionieren?