Wir unterhalten Webanwendungen mit einem gemeinsamen Hauptzweig und vielen parallelen Zweigen, einer für jede Installation, die jeweils nur wenige spezifische Änderungen aufweisen. Der Quellcode wird in Git verwaltet und ist ein hervorragendes Tool, wenn wir Funktionen und Bugfixes vom Hauptzweig in parallele übertragen möchten. Es gibt jedoch nur wenige Dateien, die sensibel sind, und das automatische Zusammenführen führt normalerweise zu schlechten Ergebnissen. Das Zusammenführen wäre also viel einfacher, wenn sie irgendwie markiert werden könnten und jede Zusammenführung zu Konflikten führen würde, die eine manuelle Zusammenführung erfordern.
Ich suchte nach einer Antwort:
- Ich verwende die Zusammenführungsoptionen --no-commit und --no-ff , aber es ist nicht dasselbe.
- Hier und hier stellt jemand die gleiche Frage, aber ohne Lösung.
- Ein ähnlicher Fall scheint zu sein, wie verhindert werden kann , dass Dateien mit .gitattributes zusammengeführt werden, die Folgendes enthalten: somefile.php merge = our . Ich habe versucht, eine Zusammenführungsoption zu finden, die zu Konflikten führen oder die manuelle Zusammenführung erzwingen würde, aber bisher keine gefunden.
- .gitattributes, die Folgendes enthalten: somefile.php -merge wird niemals automatisch zusammengeführt und erzwingt daher die manuelle Zusammenführung. Es ist eine 90% ige Lösung, aber ich versuche, die automatische Zusammenführung zu versuchen und sie als Konflikt zu markieren, unabhängig davon, ob sie erfolgreich ist oder nicht. Dies ist jedoch der Lösung bisher am nächsten. (... danke Charles Bailey für die Klarstellung ...)
- Jemand schlägt vor, einen benutzerdefinierten Zusammenführungstreiber ( 1 , 2 ) zu schreiben , aber wie das geht, ist mir alles andere als klar.
bearbeiten: Variante 4. Beschreibung
git fetch
zuerst mache und dann verwendegit difftool <file> FETCH_HEAD
, damit ich die Änderung in der Remote-Verzweigung manuell auf die lokale anwenden kann.-merge
hindert Sie nicht daran, die Dateien zusammenzuführen, sondern zwingt Sie lediglich dazu, dies manuell zu tun, z. B. mit einem Mergetool. Ist es nicht das, was du brauchst?-merge
in.gitatttributes
git merge
nichts bewirkt und alle Arbeiten mit dem Merge-Tool erledigt werden müssen? Es gibt also kein <<<<< ===== >>>> für das Merge-Tool, oder? Und Dans Lösung bietet dies?Antworten:
Option 5, ein benutzerdefinierter Zusammenführungstreiber, ist wahrscheinlich der Weg, um dem, was Sie wollen, am nächsten zu kommen. Es ist überraschend einfach zu tun. Im Folgenden finden Sie ein Beispiel für eines, das Sie meiner Meinung nach dem gewünschten Verhalten ziemlich nahe bringen sollte.
Erstellen Sie zunächst ein Merge-Treiberskript mit dem Namen
merge-and-verify-driver
. Machen Sie es ausführbar und platzieren Sie es an einem geeigneten Ort (Sie können dieses Skript auch in das Repo einchecken, da die Konfigurationsdatei des Repos davon abhängt). Git wird dieses Shell-Skript ausführen, um die Zusammenführung der vertraulichen Dateien durchzuführen:Dies führt nur das Standard-Zusammenführungsverhalten aus, das Git selbst normalerweise ausführt. Der Hauptunterschied besteht darin, dass das Skript immer einen Wert ungleich Null zurückgibt (um anzuzeigen, dass ein Konflikt aufgetreten ist, auch wenn die Zusammenführung tatsächlich ohne Konflikte gelöst wurde).
Als Nächstes müssen Sie Git über die Existenz Ihres benutzerdefinierten Zusammenführungstreibers informieren. Sie tun dies in der Konfigurationsdatei des Repos (
.git/config
):In diesem Beispiel habe ich
merge-and-verify-driver
das oberste Verzeichnis des Repos (./
) abgelegt . Sie müssen den Pfad zum Skript entsprechend angeben.Jetzt müssen Sie den vertraulichen Dateien nur noch die richtigen Attribute zuweisen, damit beim Zusammenführen dieser Dateien der benutzerdefinierte Zusammenführungstreiber verwendet wird. Fügen Sie dies Ihrer
.gitattributes
Datei hinzu:Hier habe ich Git gesagt, dass jede Datei mit einem Namen, der dem Muster entspricht
*.sensitive
, den benutzerdefinierten Zusammenführungstreiber verwenden sollte. Natürlich müssen Sie ein Muster verwenden, das für Ihre Datei (en) geeignet ist.quelle
Diese beiden Befehle scheinen den gleichen Effekt zu haben wie die Verwendung des benutzerdefinierten Zusammenführungstreibers:
Der erste Befehl stoppt die Zusammenführung vor dem Erstellen des Zusammenführungs-Commits, und der zweite Befehl markiert alle in den beiden Zweigen geänderten Dateien als zu lösenden Konflikt, auch wenn ursprünglich kein Konflikt bestand.
quelle
Hinweis: Dieser Artikel " Schreiben eines Git-Merge-Treibers für PO-Dateien " veranschaulicht die Art der Manipulation, die Sie beim manuellen Zusammenführen einer Datei durchführen können: Sie können sie vorverarbeiten, damit für die manuelle Zusammenführung bestimmte Daten bereitstehen.
git merge-file
kann zum Beispiel verwendet werden, um Dateien vor dem Zusammenführen (!) zu entschlüsseln (und neu zu verschlüsseln ).In Ihrem Fall stellen Sie beim Beenden Ihres Zusammenführungstreibers mit einem Status ungleich 0 sicher, dass die Zusammenführung manuell erfolgt.
quelle