Git Pull behält lokale, nicht festgeschriebene Änderungen bei
Lesezeit: 6 Minuten
Johnny Everson
Wie kann ich ein Git-Projekt sicher aktualisieren (Pull) und dabei bestimmte Dateien unberührt lassen, selbst wenn es Upstream-Änderungen gibt?
myrepo/config/config.php
Gibt es eine Möglichkeit, selbst wenn diese Datei auf der Fernbedienung geändert wurde, wenn ich Git Pull verwende, alles andere aktualisiert wird, diese Datei jedoch unverändert bleibt (nicht einmal zusammengeführt)?
PS. Ich muss tun, was ich verlange, da ich nur Git-basierte Bereitstellungsskripte schreibe. Ich kann Konfigurationsdateien nicht in Vorlagen umwandeln.
Ich brauche also eine Möglichkeit, Update-Skripte zu schreiben, die nicht verlieren, was lokal geändert wurde. Ich hatte auf etwas so Einfaches gehofft wie:
mögliches Duplikat von Ist es möglich, bestimmte Commits auszuschließen, wenn eine Git-Zusammenführung durchgeführt wird?
– Daenyth
2. Mai 2012 um 13:58
Es ist nicht festgeschrieben. Ich würde es lieber nicht müssen
– Johnny Everson
2. Mai 2012 um 14:12
@JhonnyEverson: Es handelt sich insgesamt um die gleiche Problemklasse (Sie haben eine Konfigurationsdatei und möchten keine spezifischen Einstellungen festlegen, aber die Struktur der Konfigurationsdatei muss verfolgt werden.)
– Daenyth
2. Mai 2012 um 16:10 Uhr
GoZoner
Es gibt eine einfache Lösung, die auf Git-Stash basiert. Verstauen Sie alles, was Sie geändert haben, ziehen Sie alle neuen Dinge herunter und wenden Sie Ihren Vorrat an.
git stash
git pull
git stash pop
Bei Stash Pop kann es zu Konflikten kommen. In dem von Ihnen geschilderten Fall gäbe es tatsächlich einen Konflikt config.php. Aber die Lösung des Konflikts ist einfach, weil Sie wissen, dass das, was Sie in den Vorrat legen, das ist, was Sie wollen. Also mach das:
git checkout --theirs -- config.php
Dieser Befehl git checkout –theirs ist sehr verwirrend. Es hat einmal das getan, was ich wollte, und ein anderes Mal etwas wirklich Schlimmes. Gibt es gute Unterlagen dazu?
– Milimetrisch
19. September 2013 um 15:00 Uhr
Ja, manchmal können „ihre“ und „unsere“ verwirrend sein. In einem git merge „unser“ ist das, was sich derzeit im Arbeitsverzeichnis befindet. Aber für einen git rebase (oder git rebase -onto) kann die Bedeutung vertauscht werden.
– GoZoner
19. September 2013 um 16:13 Uhr
git stash , git pull , git stash apply Sie können den Vorrat löschen mit: git stash drop Sobald Sie die Änderungen erfolgreich zusammengeführt haben
– BeingSuman
7. Dezember 2016 um 7:41
Die Sache mit Git ist, dass man verstehen muss, was es tun wird. Die andere Sache mit Git ist, dass es selbst für kluge Leute oft sehr schwierig ist zu verstehen, was Git tun wird.
– Bradley Thomas
6. Januar 2017 um 16:07 Uhr
Sie sollten prüfen, ob es tatsächlich etwas zum Verstauen gibt. Andernfalls würden Sie gespeicherte Änderungen von einem früheren Zeitpunkt löschen git stash.
– Jörn Reimerdes
30. August 2018 um 10:29
ich benutze
git pull -X ours
Dadurch wird Git angewiesen, beim Zusammenführen die lokale Version zu verwenden.
Beachten Sie, dass die Frage verbessert wurde, um klarzustellen, dass es sich um „nicht festgeschriebene Änderungen“ handelt. Diese Antwort mit nicht festgeschriebenen Änderungen führt also zu: Fehler: Pull mit Rebase kann nicht durchgeführt werden: Ihr Index enthält nicht festgeschriebene Änderungen. Fehler: Bitte festschreiben oder verstauen.
– Valerio Bozz
17. April um 8:28
Sehr guter Punkt.
– Peter Cotton
18. April um 14:03
Wenn Sie eine Datei in Ihrem Repo haben, die von den meisten Pullern angepasst werden soll, dann benennen Sie die Datei in etwas um config.php.template und hinzufügen config.php zu deinem .gitignore.
Überprüfen Sie auch diese Antwort, Sie können sie verwenden .gitattributes um Ihre Änderungen beim Zusammenführen immer beizubehalten.
– KurzedMetal
2. Mai 2012 um 13:43
Das entspricht eher dem, was ich brauchte. Die Vorlagensache ist die elegante Lösung, aber ich fürchte, ich kann sie nicht verwenden, da ich nur Bereitstellungsskripte schreibe.
– Johnny Everson
2. Mai 2012 um 13:47 Uhr
Mark Longair
Update: Damit ist die gestellte Frage buchstäblich beantwortet, aber ich denke, dass die Antwort von KurzedMetal wirklich das ist, was Sie wollen.
Vorausgesetzt, dass:
Du bist auf der Filiale master
Der Upstream-Zweig ist master In origin
Sie haben keine nicht festgeschriebenen Änderungen
…. du könntest es tun:
# Do a pull as usual, but don't commit the result:
git pull --no-commit
# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php
# Create the commit:
git commit -F .git/MERGE_MSG
Sie können dafür einen Alias erstellen, wenn Sie dies häufig tun müssen. Beachten Sie Folgendes: Wenn Sie nicht festgeschriebene Änderungen an haben config/config.phpdas würde sie wegwerfen.
Wir können Git Pull auch mit Rebase ausprobieren
git pull --rebase origin dev
Beachten Sie, dass die Frage verbessert wurde, um klarzustellen, dass es sich um „nicht festgeschriebene Änderungen“ handelt. Diese Antwort mit nicht festgeschriebenen Änderungen führt also zu: Fehler: Pull mit Rebase kann nicht durchgeführt werden: Ihr Index enthält nicht festgeschriebene Änderungen. Fehler: Bitte festschreiben oder verstauen.
– Valerio Bozz
17. April um 8:29
Valerio Bozz
Falls es lokale, nicht festgeschriebene Änderungen gibt, um Zusammenführungskonflikte beim Ziehen zu vermeiden:
Beachten Sie, dass die Frage verbessert wurde, um klarzustellen, dass es sich um „nicht festgeschriebene Änderungen“ handelt. Diese Antwort mit nicht festgeschriebenen Änderungen führt also zu: Fehler: Pull mit Rebase kann nicht durchgeführt werden: Ihr Index enthält nicht festgeschriebene Änderungen. Fehler: Bitte festschreiben oder verstauen.
– Valerio Bozz
17. April um 8:29
Um die Frage zu beantworten: Wenn Sie bestimmte Dateien von einem Checkout ausschließen möchten, können Sie Folgendes verwenden: Sparse-Checkout
In .git/info/sparse-checkout, definieren Sie, was Sie behalten möchten. Hier wollen wir alle
aber (beachten Sie das Ausrufezeichen) config.php :
/* !/config.php
Sagen Sie Git, dass Sie Sparse-Checkout berücksichtigen möchten
git config core.sparseCheckout true
Wenn Sie diese Datei bereits lokal haben, machen Sie das, was Git bei einem Sparse-Checkout macht (teilen Sie ihm mit, dass es diese Datei ausschließen muss, indem Sie das Flag „skip-worktree“ darauf setzen).
git update-index –skip-worktree config.php
Genießen Sie ein Repository, in dem Ihre config.php-Datei Ihnen gehört – unabhängig davon, welche Änderungen im Repository vorgenommen werden.
Bitte beachten Sie, dass Konfigurationswerte NICHT in der Quellcodeverwaltung enthalten sein sollten:
Es handelt sich um eine potenzielle Sicherheitsverletzung
Es verursacht Probleme wie dieses bei der Bereitstellung
Das bedeutet, dass Sie sie ausschließen MÜSSEN (sie vor dem ersten Commit in .gitignore einfügen) und die entsprechende Datei auf jeder Instanz erstellen, in der Sie Ihre App auschecken (durch Kopieren und Anpassen einer „Vorlagen“-Datei).
Beachten Sie, dass .gitignore keine Auswirkung mehr hat, sobald Git die Verantwortung für eine Datei übernommen hat.
Da die Datei erst einmal unter Quellcodeverwaltung steht, haben Sie nur zwei Möglichkeiten (): git filter-branchRebasieren Sie Ihren gesamten Verlauf, um die Datei zu entfernen (mit
)
Erstellen Sie einen Commit, der die Datei entfernt. Es ist, als würde man einen Kampf verlieren, aber manchmal muss man damit leben. git read-tree and other merge-based commands (git merge, git checkout…) can help maintaining the skip-worktree bitmap and working directory update. $GIT_DIR/info/sparse-checkout is used to define the skip-worktree reference bitmap. When git read-tree needs to update the working directory, it resets the skip-worktree bit in the index based on this file, which uses the same syntax as .gitignore files. If an entry matches a pattern in this file, skip-worktree will not be set on that entry. Otherwise, skip-worktree will be set.
das funktioniert perfekt! Ich zitiere das Handbuch:
– Onno Roast
14506300cookie-checkGit Pull behält lokale, nicht festgeschriebene Änderungen beiyes
Sind die Änderungen an
config.php
engagiert?– Mark Longair
2. Mai 2012 um 13:58
mögliches Duplikat von Ist es möglich, bestimmte Commits auszuschließen, wenn eine Git-Zusammenführung durchgeführt wird?
– Daenyth
2. Mai 2012 um 13:58
Es ist nicht festgeschrieben. Ich würde es lieber nicht müssen
– Johnny Everson
2. Mai 2012 um 14:12
@JhonnyEverson: Es handelt sich insgesamt um die gleiche Problemklasse (Sie haben eine Konfigurationsdatei und möchten keine spezifischen Einstellungen festlegen, aber die Struktur der Konfigurationsdatei muss verfolgt werden.)
– Daenyth
2. Mai 2012 um 16:10 Uhr