2016-07-12 3 views
0

Ich muss alle Commits auflisten, die seit meiner letzten Veröffentlichung an die master-Verzweigung vorgenommen wurden. Ich muss diese Funktionalität mit pygit2 implementieren. Aber die Situation ist hier ein bisschen anders.Alle Commits seit der letzten Veröffentlichung auflisten, wenn das Tag auf ein Commit in einem anderen Zweig verweist

Die Veröffentlichung ist auf dem Zweig master machte eine tag auf einem Commit other Zweig verwenden. Der naive Ansatz wäre, die sha der letzten tagged commit zu finden und die Geschichte von der HEAD bis zu dieser sha nach unten zu verschieben. Aber diese tagged commit ist nicht auf die master Zweig in meinem Fall gemacht, es ist zu other Zweig gemacht. Interessanterweise gibt die folgende die korrekte Ausgabe, wenn sie über master Zweig laufen:

$ git log sometag..HEAD --oneline 

Hier sometag verweist auf die auf dem other Zweig gemacht commit. Also, ich möchte wissen, wie ich das programmatisch implementieren könnte, wenn ich eine Liste aller Commits habe, die auf dem Zweig master gemacht werden.

Eine Lösung, die mir in den Sinn kommt, ist die timestamp der tagged commit zu finden und meine Commit-Liste zu filtern. Wie macht das git log das, irgendwelche Ideen?

+0

Stichworte aren‘ Sie sind an Zweige gebunden und an einzelne Commits gebunden. Ein Diagramm würde hier helfen. Versuchen Sie Commits aufzulisten, die Vorfahren Ihres aktuellen Zweigs sind, die nicht Vorfahren eines bestimmten Tags sind? –

+0

@DietrichEpp, ja das weiß ich. Ich schätze, Sie schlagen "Vorgänger" eines gegebenen Etiketts vor, anstatt "Anstichen"? – darxtrix

+0

@DietrichEpp, Okay, realisierte ich den Titel. Behoben. – darxtrix

Antwort

1

Ich denke, das wird Ihnen helfen: Erstens, wir Repository.walk() bekommen verwenden eine Walker (Commit Iterator), und wir es dann ändern (Walker.hide()) alle von sometag erreichbar auszuschließen verpflichtet:

from pygit2 import Repository 
from pygit2 import GIT_SORT_TIME 

repo = Repository('.git') 
start = repo.revparse_single('refs/heads/master') 
release_tag = repo.revparse_single('refs/tags/sometag') 

walker = repo.walk(start.id, GIT_SORT_TIME) 
walker.hide(release_tag.id) 
for commit in walker: 
    print commit.message 
+0

danke dafür. @Roman Nur eine Frage, 'walker.hide' akzeptiert eine Tag-Objekt-ID anstelle einer Commit-ID? – darxtrix

+0

eine andere Sache wie funktioniert dieser Walker? Der Commit, auf den das Tag hinweist, befindet sich nicht auf dem 'Master'-Zweig und der Walker arbeitet am Master-Zweig? – darxtrix

+0

@ankcodes Ich verstehe deine erste Frage nicht. Wie funktioniert dieser Walker? Ich weiß nicht, ich weiß nur, was in der Dokumentation steht. Auf die letzte Frage ist die Antwort "Ja", aber ich verstehe die Frage nicht ganz. Hast du ein tatsächliches Problem mit diesem Code? – Roman

Verwandte Themen