Angenommen, ich arbeite mit jemandem über ein Git-Repository zusammen, und es gibt eine bestimmte Datei, an der ich keine externen Änderungen akzeptieren möchte.
Gibt es eine Möglichkeit für mich, mein lokales Repo so einzurichten, dass ich mich nicht jedes Mal über einen Zusammenschluss beschwere, wenn ich einen Zug mache? Ich möchte beim Zusammenführen dieser Datei immer meine lokale Version auswählen.
echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true
--global
Tag auftritt . Wenn Sie dieses Verhalten nur für ein einzelnes Repo möchten, lassen Sie die--global
Flaggeecho 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Antworten:
In Bezug auf die spezifische Instanz einer Konfigurationsdatei würde ich Rons Antwort zustimmen :
Eine Konfiguration sollte für Ihren Arbeitsbereich "privat" sein (daher "ignoriert", wie in "in einer
.gitignore
Datei deklariert ").Sie können eine Konfigurationsdatei haben Schablone mit Zeichen übersetzten Werte in ihm, und ein Skript , das die Umwandlung
config.template
Datei in eine private (und ignoriert) Config - Datei.Diese spezifische Bemerkung beantwortet jedoch nicht eine allgemeinere Frage, dh Ihre Frage (!):
Diese Art der Zusammenführung ist eine "Zusammenführung von Kopien", bei der Sie bei Konflikten immer "unsere" oder "ihre" Version einer Datei kopieren.
Für "eine Datei" (eine Datei im Allgemeinen, die nicht von einer "Konfigurations" -Datei spricht, da dies ein schlechtes Beispiel ist) würden Sie dies mit einem benutzerdefinierten Skript erreichen, das durch Zusammenführungen aufgerufen wird.
Git ruft dieses Skript auf, da Sie einen gitattributes- Wert definiert haben , der einen benutzerdefinierten Zusammenführungstreiber definiert .
Der "benutzerdefinierte Zusammenführungstreiber" ist in diesem Fall ein sehr einfaches Skript, das die aktuelle Version grundsätzlich unverändert lässt, sodass Sie immer Ihre lokale Version auswählen können.
IE., Wie von Ciro Santilli bemerkt :
Lassen Sie uns dies in einem einfachen Szenario mit einem msysgit 1.6.3 unter Windows in einer bloßen DOS-Sitzung testen:
Lassen Sie uns nun zwei Dateien erstellen, die beide Konflikte aufweisen, aber unterschiedlich zusammengeführt werden.
Wir werden einen "Konflikt" im Inhalt dieser beiden Dateien in zwei verschiedenen Git-Zweigen einführen:
Versuchen wir nun, "hisBranch" mit "myBranch" zusammenzuführen, mit:
dirWithCopyMerge\b.txt
wo ich will immer halten meine Versionb.txt
.Da die Zusammenführung in '
MyBranch
' erfolgt, wechseln wir zurück und fügen die 'gitattributes
' Anweisungen hinzu, mit denen das Zusammenführungsverhalten angepasst wird.Wir haben eine
.gitattributes
Datei imdirWithCopyMerge
Verzeichnis definiert (definiert nur in dem Zweig, in dem die Zusammenführung stattfinden wird :)myBranch
, und wir haben eine.git\config
Datei, die jetzt einen Zusammenführungstreiber enthält.Wenn Sie keepMine.sh noch nicht definieren und die Zusammenführung trotzdem starten, erhalten Sie Folgendes.
Das ist gut:
a.txt
ist bereit zum Zusammenführen und hat Konflikteb.txt
ist immer noch unberührt, da der Zusammenführungstreiber sich darum kümmern soll (aufgrund der Anweisung in der.gitattributes
Datei in seinem Verzeichnis).Definieren Sie eine
keepMine.sh
beliebige Stelle in Ihrem%PATH%
(oder$PATH
für unseren Unix-Freund. Ich mache natürlich beides: Ich habe eine Ubuntu-Sitzung in einer VirtualBox-Sitzung)Wie von lrkwz kommentiert und im Abschnitt " Strategien zusammenführen " unter Anpassen von Git - Git-Attributen beschrieben , können Sie das Shell-Skript durch den Shell-Befehl ersetzen .
true
Im allgemeinen Fall können Sie jedoch eine Skriptdatei definieren:
keepMine.sh
(das war ein einfacher Zusammenführungstreiber;) (In diesem Fall noch einfacher verwenden
true
)(Wenn Sie die andere Version behalten möchten , fügen Sie einfach vor der
exit 0
Zeile hinzu :cp -f $3 $2
.Das war's. Ihr Zusammenführungstreiber würde immer die Version von der anderen erhalten Zweigstelle, die alle lokalen Änderungen außer Kraft setzt)
Lassen Sie uns nun die Zusammenführung von Anfang an wiederholen:
Die Zusammenführung schlägt fehl ... nur für a.txt .
Bearbeiten Sie a.txt und verlassen Sie die Zeile von 'hisBranch'. Dann:
Lassen Sie uns überprüfen, ob b.txt während dieser Zusammenführung beibehalten wurde
Das letzte Commit stellt die vollständige Zusammenführung dar:
(Die mit Merge beginnende Zeile beweist das)
Überlegen Sie, ob Sie den Zusammenführungstreiber wie bei Git definieren, kombinieren und / oder überschreiben können:
<dir>/.gitattributes
(das sich im selben Verzeichnis befindet wie der betreffende Pfad): Wird sich.gitattributes
in Verzeichnissen gegen das andere durchsetzen.gitattributes
(das sich im übergeordneten Verzeichnis befindet), setzt nur Direktiven, wenn es nicht bereits gesetzt ist$GIT_DIR/info/attributes
. Diese Datei wird verwendet, um die In-Tree-Einstellungen zu überschreiben.<dir>/.gitattributes
Direktiven werden überschrieben .Mit "Kombinieren" meine ich den "aggregierten" Mehrfachzusammenführungstreiber.
Nick Green versucht in den Kommentaren , Zusammenführungstreiber tatsächlich zu kombinieren: siehe " Zusammenführen von Poms über Python-Git-Treiber ".
Wie in seiner anderen Frage erwähnt , funktioniert dies jedoch nur bei Konflikten (gleichzeitige Änderung in beiden Zweigen).
quelle
cp -f $3 $2
sollte wohl zitiert werden, dhcp -f "$3" "$2"
.PATH
(Unix oder WindowsPATH
) hinzuzufügen . Da dieses Skript über die Unix-Bash-Shell oder über die MingWin-Bash-MsysGit-Windows-Shell interpretiert wird, ist es portabel.Wie @ ciro-santilli kommentiert hat, ist die einfache Möglichkeit, dies
.gitattributes
mit Einstellungen zu tun :und aktivieren Sie diese Strategie mit:
(Ich füge dies als Antwort hinzu, um es sichtbarer zu machen, mache es aber zu einem Community-Wiki, um nicht zu versuchen, die Credits des Benutzers für mich selbst zu übertreffen. Bitte stimme seinem Kommentar unter dem Q hier zu, um ihm ein Lob zu geben!)
quelle
:-)
).Wir haben mehrere Konfigurationsdateien, die niemals überschrieben werden sollen. .Gitignore und .gitattributes funktionierten jedoch in unserer Situation nicht. Unsere Lösung bestand darin, die Konfigurationsdateien in einem Konfigurationszweig zu speichern. Lassen Sie dann zu, dass die Dateien während der Git-Zusammenführung geändert werden. Verwenden Sie jedoch unmittelbar nach der Zusammenführung den "Git-Checkout-Zweig -". um unsere Konfigurationsdateien nach jeder Zusammenführung aus dem Zweig configs zu kopieren. Detaillierte Antwort zum Stackoverflow hier
quelle