wake-up-neo.net

Git - Ignoriere Dateien während der Zusammenführung

Ich habe ein Repo namens myrepo auf dem entfernten beanstalk-Server.

Ich habe es auf meinen lokalen Rechner geklont. Zwei zusätzliche Zweige erstellt: staging und dev. Diese Zweige wurden auch in den Remote-Modus verschoben.

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.xml, die in jedem Zweig unterschiedlich ist.

Ich möchte diese Datei nur beim Zusammenführen ignorieren. Aber ich möchte, dass dies eingeschlossen wird, wenn ich zur Kasse oder von/zur Repo-Filiale verpflichte.

Der Grund, warum ich das möchte, ist, dass wir ein Bereitstellungsskript haben, das den jeweiligen Zweig abruft (checkout) und auf den jeweiligen Servern implementiert. Daher müssen wir die config.xml-Datei dieses bestimmten Zweigs wie oben angegeben bei der Bereitstellung auf den bestimmten Server übertragen.

Ich denke, .gitignore wird nicht funktionieren. Was sind die anderen Optionen? Beachten Sie, dass die ignorierte Datei Bestandteil von Checkout und Commit sein sollte, was wichtig ist. es sollte nur während der Zusammenführung ignoriert werden.

Vielen Dank!

72
Kevin Rave

Ich fand git attributes. Versuch es. Bis jetzt arbeiten Noch nicht alle Szenarien geprüft. Aber es sollte die Lösung sein.

Zusammenführungsstrategien - Git-Attribute

35
Kevin Rave

Ich bin über dieses Problem hinweggekommen, indem ich den Befehl git merge mit der Option --no-commit verwendet habe und dann die bereitgestellte Datei explizit entfernt und die Änderungen an der Datei ignoriert habe. Zum Beispiel: Angenommen, ich möchte Änderungen an myfile.txt ignorieren. Ich 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 mit zu überspringenden Dateien haben.

75
unmesh-gurjar

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

Sie können das Attribut angeben, um Git mitzuteilen, dass es unterschiedliche Zusammenführungsstrategien für eine bestimmte Datei verwenden soll. Hier möchten wir den bestehenden config.xml für unsere Niederlassung beibehalten. Wir müssen merge=ours in config.xml-Datei auf .gitattributes setzen.

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

  1. Fügen Sie eine .gitattributes-Datei auf der Stammebene des Repositorys hinzu

  2. Sie können ein Attribut für confix.xml in der .gitattributes-Datei einrichten

    config.xml merge=ours
    
  3. Und dann definieren Sie eine Dummy-unsere-Merge-Strategie mit:

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

Wenn Sie stag form dev branch zusammenführen, bleibt der config.xml von stag branch anstelle der Zusammenführungskonflikte mit der Datei config.xml auf der ursprünglichen Version erhalten.

10
eigenharsha

Sie können mit git merge --no-commit beginnen und dann die Zusammenführung wie gewünscht bearbeiten, d. H. Indem Sie config.xml oder eine andere Datei nicht mehr bereitstellen und dann eine Festschreibung ausführen. Ich vermute, dass Sie es später mit Hilfe von Hooks weiter automatisieren möchten, aber ich denke, es lohnt sich mindestens einmal manuell durchzugehen.

5
gcbenison

Sie könnten .gitignore verwenden, um den config.xml vom Repository fernzuhalten, und dann einen post commit hook verwenden, um die entsprechende config.xml-Datei auf den Server hochzuladen.

3
tlehman

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

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

Beispiel:-

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

1

Beispiel:

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

Code (in der Wurzel von yout git):

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 Erweiterung .txt:

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