Git - Dateien beim Zusammenführen ignorieren

114

Ich habe ein Repo myrepoauf dem Remote- beanstalkServer aufgerufen .

Ich habe es auf meinen lokalen Computer geklont. Erstellt zwei zusätzliche Zweige: stagingund dev. Schob diese Zweige auch auf Remote.

Jetzt:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

Ich habe eine Datei namens, config.xmldie in jedem Zweig anders ist.

Ich möchte diese Datei nur beim Zusammenführen ignorieren. Ich möchte jedoch, dass dies beim Auschecken oder Festschreiben von / zum Repo-Zweig berücksichtigt wird.

Der Grund, warum ich dies möchte, ist, dass wir ein Bereitstellungsskript haben, das den spezifischen Zweig abruft (auscheckt) und auf den jeweiligen Servern bereitstellt. Daher muss die config.xmlDatei dieses bestimmten Zweigs bei der Bereitstellung wie oben angegeben auf dem jeweiligen Server gespeichert werden.

Ich denke, es wird .gitignorenicht funktionieren. Was sind die anderen Optionen? Beachten Sie, dass die ignorierte Datei Teil des Auscheckens und Festschreibens sein sollte, was wichtig ist. Es sollte nur bei Zusammenführungen ignoriert werden.

Vielen Dank!

Kevin Rave
quelle
Im Standardmodus ist Git Pull eine Abkürzung für Git Fetch, gefolgt von Git Merge FETCH_HEAD. Ihre Aussagen stehen also in Konflikt miteinander.
zzk
Nun, ich würde sagen, es ist zur Kasse. Nicht ziehen. Ich werde die Frage aktualisieren, um klar zu sein.
Kevin Rave
2
Haben Sie jemals eine Lösung dafür gefunden? Git-Attribute sind nur dann nützlich, wenn die Datei Konflikte zwischen den zusammengeführten Zweigen aufweist, sodass dies nicht immer ausreicht.
pvinis
Hast du dich mit symbolischen (nicht gefolgt von Git) oder sogar harten Verbindungen zur Rettung befasst?
Frank Nocke

Antworten:

93

Ich habe dieses Problem behoben, indem ich den Befehl git merge mit der --no-commitOption verwendet und dann die bereitgestellte Datei explizit entfernt und die Änderungen an der Datei ignoriert habe. Beispiel: Angenommen, ich möchte alle Änderungen ignorieren. myfile.txtIch gehe wie folgt vor:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Sie können die Anweisungen 2 und 3 in eine for-Schleife einfügen, wenn Sie eine Liste der zu überspringenden Dateien haben.

Unmesh-Gurjar
quelle
2
Ich würde "--no-ff" hinzufügen, wenn eine Datei nicht überschrieben werden soll, wenn die Zusammenführung in einer Schnellvorlaufstrategie erfolgt.
Ilia Shakitko
1
Also, was macht git reset HEAD myfile.txtgenau? Wie hilft es bei unserem Ziel hier?
Kid_Learning_C
Wie setzt man die Zeilen 2 und 3 in eine Schleife?
AndroidDev
52

Am Ende fand ich Schwachkopf attributes. Ich versuche es. Bisher arbeiten. Hat noch nicht alle Szenarien überprüft. Aber es sollte die Lösung sein.

Strategien zusammenführen - Git-Attribute

Kevin Rave
quelle
4
aber ich fand diese git-scm.com/book/ch7-2.html#Merge-Strategies
Nate-
1
Hier ist der richtige Link für den Abschnitt mit den Zusammenführungsstrategien der git-Attribute docs: git-scm.com/book/en/v2/…
Adrian Laurenzi
3
Fand dies gut erklärt in einem Artikel medium.com/@porteneuve/…
ShawnFeatherly
9
Dies scheint ein Problem zu sein, wenn es keine Konflikte gibt? Dateien werden noch zusammengeführt?
Brett
18

.gitattributes - ist eine Root-Datei Ihres Repositorys, die die Attribute für ein Unterverzeichnis oder eine Teilmenge von Dateien definiert.

Sie können das Attribut angeben, mit dem Git angewiesen wird, verschiedene Zusammenführungsstrategien für eine bestimmte Datei zu verwenden. Hier wollen wir das Bestehende config.xmlfür unsere Branche erhalten. Wir müssen das merge=oursin config.xmlin .gitattributesDatei setzen.

merge=ours Weisen Sie git an, unsere (aktuelle Zweig-) Datei zu verwenden, wenn ein Zusammenführungskonflikt auftritt.

  1. Fügen Sie eine .gitattributesDatei auf der Stammebene des Repositorys hinzu

  2. Sie können ein Attribut für confix.xml in einer .gitattributesDatei einrichten

    config.xml merge=ours
    
  3. Und dann definieren Sie eine Dummy-Strategie für unsere Zusammenführung mit:

    $ git config --global merge.ours.driver true
    

Wenn Sie den stagFormularzweig zusammenführen dev, wird die Datei config.xml des Hirschzweigs in der ursprünglichen Version beibehalten, anstatt dass die Zusammenführung mit der Datei config.xml in Konflikt steht.

Eigenharsha
quelle
15
Aber was ist, wenn es keinen Konflikt gibt? Wie behalte ich beim Zusammenführen immer eine bestimmte Datei?
Igor Yalovoy
2
@IgorYalovoy: Wenn es keinen Konflikt gibt ... nun, das ist ein wenig schwierig, da es tatsächlich von Hash-IDs aus funktioniert, aber: Wenn config.xmles von der Merge-Basis zu einer der Zweig-Tip-Versionen völlig unverändert ist , nimmt Git nur die geänderte Version ohne Blick auf die merge.ours.driverEinstellung. Sie haben also Recht, besorgt zu sein.
Torek
1
Kopieren und Einfügen aus Git-Dokumenten: Strategien zusammenführen - Git-Attribute. Link
Kyb
Diese Methode führt jedes Mal zu "Merge Commits".
rsmets
2
"unsere" scheint ein willkürlicher Name für die neue Strategie zu sein, die eingeführt wird. Ich fand das verwirrend, weil theirses sich um eine integrierte Zusammenführungsstrategie handelt. Aber es scheint, dass man dann schreiben <pattern> merge=fookann git config --global merge.foo.driver true, und es wird genauso funktionieren.
Kyle Strand
8

Sie können zunächst git merge --no-commitdie Zusammenführung verwenden und dann bearbeiten, wie Sie möchten config.xml, z. B. durch Aufheben der Bereitstellung oder einer anderen Datei, und dann festschreiben . Ich vermute, Sie möchten es danach mithilfe von Hooks weiter automatisieren, aber ich denke, es lohnt sich, mindestens einmal manuell durchzugehen.

gcbenison
quelle
2
Bietet git attributeseine klare Lösung? Ich kann das nicht verstehen. git-scm.com/book/en/…
Kevin Rave
4

Sie könnten nutzen .gitignoredie halten config.xmlaus dem Repository und dann verwenden , um einen Beitrag commit die entsprechende Upload - config.xmlDatei auf dem Server.

Tlehman
quelle
1
Ich weiß, das ist eine Art Hack. Ich versuche eine saubere Lösung zu finden. Was ist git attributes. Irgendeine Idee, wie es funktioniert? Ich kann das nicht verstehen. git-scm.com/book/en/…
Kevin Rave
1
Ich habe noch nichts davon gehört, ich versuche das Attribut merge = our anzuwenden, sieht vielversprechend aus.
Tlehman
1
Git-Attribute sind fantastisch! Sie können git sogar sagen, wie Nicht-Text-Dateien zu unterscheiden sind, sodass Sie pdf2text verwenden können, um PDFs zu unterscheiden!
Tlehman
2

Beispiel:

  1. Sie haben zwei Zweige: master,develop
  2. Sie haben eine Datei im developZweig erstellt und möchten diese beim Zusammenführen ignorieren

Code:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

Sie können auch Dateien mit derselben Erweiterung ignorieren

Zum Beispiel alle Dateien mit der .txtErweiterung:

echo "*.txt merge=ours" >> .gitattributes
Sole Sensei
quelle
1

Hier git-update-index - Registrieren Sie den Dateiinhalt im Arbeitsbaum im Index.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

Beispiel:-

git update-index --assume-unchanged somelocation/pom.xml

Sireesh Yarlagadda
quelle
Das ist schön beim Schieben, beschwert sich aber trotzdem beim Ziehen und könnte die Datei überschreiben.
Rolf
1
Haben Sie versucht, Ihren Dateieintrag in die .gitignore-Datei einzufügen? @Rolf
Sireesh Yarlagadda