.gitattributes & individuelle Zusammenführungsstrategie für eine Datei

Lesezeit: 6 Minuten

gitattributes individuelle Zusammenfuhrungsstrategie fur eine Datei
Jan

Ich habe einen Master- und einen Testzweig meiner (Web-)Anwendung. Diese Projekte sind fast gleich, außer einer Datei, die die Anwendung einrichtet, sagen wir “setup”.

Immer wenn ich einen Zweig mit dem anderen zusammenführe, möchte ich, dass dieser Zweig seine Version des Setups behält. Das heißt, git sollte nicht versuchen, die Änderungen an dieser Datei zusammenzuführen.

Ich folgte dem Anleitung aus dem Pro Git-Buch und erstellte eine .gitattributes-Datei mit der Zeile “setup merge=ours”. Dies funktioniert jedoch nicht – weder bei Fast-Forward-Merges noch wenn ich Konflikte einführe.

(Um genau zu sein:

$: mkdir gitest
$: cd gittest
$: git init
$: echo "setup merge=ours" >> .gitattributes 
$: echo "master" >> setup
$: git add setup .gitattributes
$: git commit -a -m ...
$: git branch test
$: git checkout test
$: echo "test" >> setup
$: git commit -a -m ...
$: git checkout master
$: git merge test

Erwartetes Ergebnis: setup enthält das Wort „master“, stattdessen führt git eine ff-Zusammenführung durch und setup ist „test“.)

  • mögliches Duplikat von Wie weise ich Git an, immer meine lokale Version für konfliktbehaftete Zusammenführungen einer bestimmten Datei auszuwählen?

    – Karl Bielefeldt

    29. März 2011 um 1:44 Uhr

  • Ich habe die Git-Quelle durchgesehen und kann nicht sehen, wie merge=ours mal gearbeitet. Ich glaube, jemand hat das geschrieben, ohne es zu versuchen. Diese andere Antwort bietet eine kompliziertere Lösung, aber mit dem Bonus, dass sie tatsächlich zu funktionieren scheint.

    – Karl Bielefeldt

    29. März 2011 um 1:47 Uhr

  • Das scheint tatsächlich zu funktionieren! Danke Karl. Als leichte Modifikation dieser Antwort: Einfach “exit 0” als Merge-Treiber zu setzen, ist einfacher als ein dediziertes Bash-Skript, das genau das tut.

    – Jan

    29. März 2011 um 15:21 Uhr

1646372290 807 gitattributes individuelle Zusammenfuhrungsstrategie fur eine Datei
Jorge E. Cardona

Ich hatte den gleichen Fehler und er kann gelöst werden, indem einfach ein “unserer” Merge-Treiber in .git/config definiert wird:

[merge "ours"]
    name = "Keep ours merge"
    driver = true

Da true immer 0 zurückgibt, wird die temporäre Datei mit dem aktuellen Status nicht geändert und bleibt die endgültige Version.

Hier können Sie mehr über Merge-Treiber lesen: http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_defining_a_custom_merge_driver

Nachtrag:

Dies funktioniert immer dann, wenn der Treiber tatsächlich aufgerufen wird, und dies scheint nur dann der Fall zu sein, wenn Commits dieselben Dateien ändern (git das Merge-Attribut). Bei Änderungen in einem einzelnen Zweig wird der Treiber nicht aufgerufen.

  • @VitalyB Ich habe mehrere Möglichkeiten ausprobiert, aber es funktioniert nur, wenn in beiden Zweigen eine Änderung erfolgt. Haben Sie mindestens einmal einen Konflikt, dann wird die Zusammenführungsstrategie aufgerufen. Von diesem Punkt an wird für alle Konflikte und Änderungen (einschließlich ff-fähiger) die Zusammenführungsstrategie aufgerufen und die beabsichtigte Datei ist nicht betroffen. Siehe Kevins Antwort unten

    – Aswin Kumar

    2. August 2013 um 11:59 Uhr

  • Das Vorhandensein eines Konflikts mindestens einmal garantiert nicht, dass die Zusammenführungsstrategie in Zukunft immer aufgerufen wird. Meine Erfahrung zeigt mir leider etwas anderes.

    – Richard Le Mesurier

    10. April 2014 um 10:55 Uhr

  • Dein Nachtrag ist richtig. Merge “ours” schützt eine Datei nicht vor Änderungen. Allerdings schützt es Änderungen von Änderungen. In Anbetracht von A->B->B’ wird durch das Zusammenführen von B’->A nur A==B’, selbst wenn “unsere” zusammengeführt wird, da A keine Änderungen aufweist, während B’ dies tut und A ein direkter Vorfahr ist von B’, wird es als “unser” angesehen. Wenn jedoch auch A->A’, dann funktioniert das Zusammenführen von B’->A’ nicht für Dateien, die durch Merge “ours” geschützt sind und sich in A’ geändert haben.

    – KommaToast

    13. September 2014 um 21:18 Uhr


Ich stellte fest, dass, wenn ich die Dateien in beiden Zweigen änderte und die Änderungen an jedem Zweig festlegte und dann die Zusammenführung versuchte, der Zusammenführungstreiber aufgerufen und auf meine abgehört wurde .gitattributes was angibt merge=ours. Danach unterscheiden sich die beiden Dateien immer in den beiden Zweigen und daher wird der Merge-Treiber immer aufgerufen, sodass ich keinen benutzerdefinierten Merge-Treiber benötigte, der die Datei berührt. Beides musste zunächst nur modifiziert werden.

  • Sind Sie im letzten Jahr auf irgendwelche Probleme mit dieser Technik gestoßen? Ich habe auch keine Notwendigkeit gefunden, eine benutzerdefinierte Neudefinition der “unsere” Strategie zu implementieren, wie von Jorge vorgeschlagen. Aber ich frage mich, ob es irgendetwas gibt, das zurückkommt, um dich zu beißen, wenn du nicht hinsiehst.

    – Richard Le Mesurier

    8. April 2014 um 7:18 Uhr

  • Ich habe keine Probleme bemerkt, andererseits verwende ich es für den sehr einfachen Zweck, einige einzelne Dateien (wie Gemfile.lock und .bundle/config) in der Versionskontrolle zu halten, aber unterschiedlich in den Zweigen der verschiedenen Entwickler. Ich bin mir nicht sicher, wie koscher es ist, aber ich fand es praktisch.

    – Kevin Bullaughey

    8. April 2014 um 17:07 Uhr


  • Kevin, mein Anwendungsfall ist ähnlich. Ich hänge meinen gesamten Android-Debug-Code von a ab public static boolean DEBUG_ON. In der Lage zu sein, es so zu halten false in meinen Produktionszweigen, und true in meinen Entwicklungszweigen macht das Leben (und das GIT-Log) viel einfacher. Also danke, dass du mich in die richtige Richtung gewiesen hast. Aus Interesse ist hier der von mir erstellte Beitrag, der auf Ihre Antwort verweist: git smudge/clean filter between Branches

    – Richard Le Mesurier

    8. April 2014 um 17:52 Uhr

  • Einen Tag später, und meine Dateien werden nicht mehr getrennt aufbewahrt. Git hat sich entschieden, die Änderungen jetzt branchenübergreifend zusammenzuführen. Obwohl sich die beiden Dateien in den Zweigen unterscheiden, scheint der Merge-Treiber nicht mehr aufgerufen zu werden. Das Mitleid…

    – Richard Le Mesurier

    10. April 2014 um 10:54 Uhr

  • Ich denke, das liegt daran, dass Git sich damit befasst Änderungen an Dateiennicht zu Dateien selbst. Ein typisches Beispiel: Nehmen wir an, Sie haben einen einzigen Zweig. Jetzt erstellen Sie einen “test”-Branch und fügen .gitattributes-Dateien in jedem hinzu, die Ihre “config.php merge=ours” angeben (und stellen Sie natürlich sicher, dass Sie set git config merge.ours.driver=true). Nehmen wir nun an, nachdem Sie den neuen Zweig erstellt haben, nehmen Sie einige Änderungen „test“ an config.php vor, checken dann „master“ aus und führen „test“ wieder darin ein. Was passieren wird, ist, dass „test“ Änderungen an der config.php hat, aber master keine, also gibt es kein „unser“ da „wir“ keine Änderungen haben!

    – KommaToast

    13. September 2014 um 21:03 Uhr


1646372291 704 gitattributes individuelle Zusammenfuhrungsstrategie fur eine Datei
Uwe Kleine-König

Der Merge-Treiber wird nur in nicht trivialen Fällen aufgerufen, dh wenn sowohl Master als auch Test Setup berührt haben (und Sie den Merge-Treiber definieren müssen ours Erste):

git init
git config merge.ours.name '"always keep ours" merge driver'
git config merge.ours.driver 'touch %A'
echo "setup merge=ours" >> .gitattributes 
echo "master" >> setup
git add setup .gitattributes
git commit -a -m ...
git branch test
git checkout test
echo "test" >> setup
git commit -a -m ...
git checkout master
echo "more content" >> setup
git commit -a -m ...
git merge test

Allerdings frage ich mich, ob es überhaupt sinnvoll ist, Setup im Repository zu haben. Wenn Sie es wirklich unter Versionskontrolle haben möchten, können Sie Submodule oder die Subtree-Merge-Strategie verwenden, um gemeinsame Dateien synchron zu halten.

Haben Sie ein schmieriges sauberes Skript anstelle von separaten Zweigen. Das Skript kann je nach Computer unterschiedlich sein.

931470cookie-check.gitattributes & individuelle Zusammenführungsstrategie für eine Datei

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

Privacy policy