Git Pull behält lokale, nicht festgeschriebene Änderungen bei

Lesezeit: 6 Minuten

Johnny Eversons Benutzeravatar
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:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

Dann git pull

  • 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

Benutzeravatar von GoZoner
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 Longairs Benutzeravatar
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:

  1. Du bist auf der Filiale master
  2. Der Upstream-Zweig ist master In origin
  3. 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

Benutzeravatar von Valerio Bozz
Valerio Bozz

Falls es lokale, nicht festgeschriebene Änderungen gibt, um Zusammenführungskonflikte beim Ziehen zu vermeiden:

git stash save
git pull
git stash pop

Quelle:

https://git-scm.com/docs/git-stash

  • 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

  1. In .git/info/sparse-checkout, definieren Sie, was Sie behalten möchten. Hier wollen wir alle

    aber (beachten Sie das Ausrufezeichen) config.php :

  2. /* !/config.php

    Sagen Sie Git, dass Sie Sparse-Checkout berücksichtigen möchten

  3. 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).

  4. 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

1450630cookie-checkGit Pull behält lokale, nicht festgeschriebene Änderungen bei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy