2016-04-22 12 views
2

Ich versuche, einige meiner Standard-Workflows zu automatisieren und eine Sache, die ich oft selbst finde, ist, Änderungen an einem Remote-Master-Zweig in meinen eigenen lokalen Zweig zusammenzuführen und das Ergebnis zu pushen.Wie füge ich den Master-Zweig in einen Feature-Zweig mit GitPython ein?

So sind die Schritte wie folgt:

  1. Schalter
  2. Pull Änderungen von entfernten
  3. Switch to original Funktionszweig
  4. Merge von Master in Funktion Zweig
  5. Push-Funktion Zweig zu meistern zu entfernt

Ich war Ich versuche, ein kurzes Python-Skript zu schreiben, um dies für mich mit einem einzigen Anruf zu tun, aber ich stecke auf Schritt 4. Ich kann keinen Sinn von the docs, um herauszufinden, wie dies auch tun.

git.exe selbst verwenden würde ich einfach tun: git.exe merge master

Ist dies möglich, das GitPython Modul und wenn ja, wie sollte man dies tun?

Antwort

4

Ohne einen sehr zwingenden Grund, würde ich vorschlagen, nur die git Binärdatei verwenden, um Ihre Aufgaben zu erfüllen. Wenn Sie dies jedoch mit GitPython tun möchten, werfen Sie einen Blick auf den Abschnitt Advanced Repo usage der Dokumentation, der eine Beispiel-Merge-Operation enthält.

Zum Beispiel, ich habe ein Repository mit zwei Zweigen namens master und feature. Ich bin derzeit auf dem Zweig feature, und ich möchte Änderungen von Master zusammenführen.

Ich beginne mit einem Repo Objekt initialisiert wird:

>>> import git 
>>> repo = git.Repo('.') 

Jetzt brauche ich einen Verweis auf meinen aktuellen Zweig; Ich kann dies tun:

>>> current = repo.active_branch 
>>> current 
<git.Head "refs/heads/feature"> 

Oder ich kann den Zweig nach Namen bekommen:

>>> current = repo.branches['feature'] 
>>> current 
<git.Head "refs/heads/feature"> 

ich auch einen Verweis auf die master Zweig benötigen:

>>> master = repo.branches['master'] 
>>> master 
<git.Head "refs/heads/master"> 

Jetzt muss ich finden die Zusammenführungsbasis dieser zwei Zweige (das heißt, der Punkt, an dem sie auseinander gehen:

>>> base = repo.merge_base(current, master) 
>>> base 
[<git.Commit "9007141b5daa35c39afda2d6baf670438d7424a7">] 

Jetzt sind wir inszenieren eine Zusammenführung:

>>> repo.index.merge_tree(master, base=base) 
<git.index.base.IndexFile object at 0x7fa8bb6a9f70> 

Und es begehen, Anbindungen an die beiden Mutter Bereitstellung verpflichtet:

>>> repo.index.commit('Merge master into feature', 
... parent_commits=(current.commit, master.commit)) 
<git.Commit "fb7051d7be36b7998a8f6c480120f84f3f9d9f73"> 
>>> 

An dieser Stelle haben wir erfolgreich zusammengeführt, die beiden Zweige, aber wir haben nicht das Arbeitsverzeichnis geändert.Wenn wir an die Shell Prompt zurück, git status Datei zeigen, dass file1 modifiziert wurde (weil es nicht mehr übereinstimmt, was im Repository ist):

$ git status 
On branch feature 
Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: file1 

Wir brauchen eine Kasse des neuen auszuführen begehen:

>>> current.checkout(force=True) 
<git.Head "refs/heads/feature"> 

Und jetzt:

$ git status 
On branch feature 
nothing to commit, working directory clean 

Der obige Prozess ist zerbrechlich; Wenn es Zusammenfügungskonflikte gibt, ist es nur gehen zu explodieren, weshalb Sie wahrscheinlich besser dran sind, der CLI zu bleiben.

+0

Danke; das ist wirklich nützlich. Selbst wenn Sie die CLI verwenden, kann es bei der Zusammenführung zu Problemen kommen, wie Sie es vorschlagen. Würden Sie nicht nach Zusammenführungskonflikten suchen und diese behandeln müssen? Oder ist das, was du oben vorgeschlagen hast, sogar _more_ gefährlich? :-) –

+0

Ich glaube nicht, dass es gefährlich ist, aber der 'git'-CLI wird stark getestet und ist so konzipiert, dass er ein Werkzeug für den Endnutzer ist und somit auf Fehler nützlicher reagieren kann. – larsks

+0

Okay, verstanden. Ich denke, ich kann verwenden, was Sie oben geschrieben haben, dann greifen Sie auf die Zusammenführung mit der CLI auf und schließlich, setzen Sie mein Skript fort, um die letzten paar Befehle zu tun. –

Verwandte Themen