Finden Sie einen Git-Zweig-Ersteller heraus


158

Ich möchte herausfinden, wer eine Niederlassung erstellt hat.

Ich kann das irgendwie mit:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

Dies gibt jedoch den letzten Committer pro Zweig zurück, nicht unbedingt die Person, die den Zweig erstellt hat.


7
Sie können keinen Zweigautor / -ersteller in git bekommen. Was Sie hier tun, ist, den Autor des Branchentipps zu erhalten. Es wird sich ändern, sobald jemand dort ein neues Commit drückt.
Sylvain.joyeux

1
Haftungsausschluss: Die implizite Annahme in dieser Frage / Antwort lautet "in einem Workflow mit nur einer Person pro Zweig ". In anderen Workflows, in denen mindestens zwei Mitarbeiter einen Zweig gemeinsam nutzen, sind diese Informationen (Zweigersteller) nicht über git erhältlich, und die obigen Antworten können dazu führen, dass jemand falsche Annahmen trifft.
RomainValeri

Antworten:


56

Ein Zweig ist nichts anderes als ein Festschreibungszeiger. Daher werden keine Metadaten wie "Wer hat mich erstellt?" Verfolgt. Überzeugen Sie sich selbst. Versuchen Sie es cat .git/refs/heads/<branch>in Ihrem Repository.

Wenn Sie diese Informationen in Ihrem Repository wirklich nachverfolgen möchten, lesen Sie die Zweigbeschreibungen. Mit ihnen können Sie Zweigstellen zumindest lokal beliebige Metadaten zuordnen.

Auch DarVars Antwort unten ist eine sehr clevere Möglichkeit, an diese Informationen zu gelangen.


Für mich war dies in .git / refs / Heads / <branch> "ref" war Plural
Jeffrey LeCours

4
DarVars Antwort ist zwar für einige wahrscheinlich nützlich, aber keine genaue Antwort. Es ist einfach eine prägnantere Methode, um das zu tun, was der Autor der ursprünglichen Frage bereits getan hat (nämlich den Namen des letzten Commiters in einen Zweig zu bringen).
Peabody

295

Liste der entfernten Git-Zweige nach Autor sortiert nach Committer-Datum:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate

8
Es ist die letzte Person, die sich für diesen Zweig engagiert. Da ein Zweig nur ein Zeiger auf ein Commit ist.
DarVar

7
Sollte dies unter Windows funktionieren? Ich habe "Eingabedatei zweimal angegeben".
Steve Chambers

27
Mit tabellarischer Formatierung: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(Idee von stackoverflow.com/a/3631819 - möglicherweise müssen die Zahlen im awk printf angepasst werden, abhängig von der maximalen Länge des Datums / der Autorennamen)
Gary S. Weaver

15
Falls für den Zweig kein Commit vorhanden ist und dieser vom Master erstellt wurde, ist der "Autor des Zweigs" völlig unabhängig von diesem Zweig, sondern nur vom letzten Committer auf dem Master. Wenn Sie Änderungen vom Master übernehmen und es sich um einen schnellen Vorlauf handelt, ist dies erneut der letzte Committer des Masters, der möglicherweise nie an diesem Zweig gearbeitet hat.
Gustave

9
Obwohl diese Antwort und dieser Befehl möglicherweise nützlich sind, halte ich sie für eine irreführende Antwort auf die Frage. Hier werden Autorennamen in allen Zweigen aufgelistet, die der letzte Commiter in einem Zweig sind. Es gibt eine Reihe von Umständen, unter denen dies nicht der Schöpfer des Zweigs wäre. Die wirkliche Antwort ist, dass Git diese Informationen einfach nicht speichert.
Peabody

46

Ich habe die vorherigen Antworten mithilfe der --sortFlagge optimiert und einige Farben / Formatierungen hinzugefügt:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes

1
perfekt für die Schuld in Farben
suarsenegger


8

Hinzufügen zu DarVars Antwort :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PS: Wir haben AWK verwendet, um den Autor und den Remote-Zweig hübsch zu drucken.


3
Das funktioniert nur, wenn der Autorenname ein einzelnes Wort ist. Wenn Vor- und Nachname getrennt sind, sehen Sie den Nachnamen anstelle des
Legato

5

Sie können herausfinden, wer einen Zweig in Ihrem lokalen Repository erstellt hat

git reflog --format=full

Beispielausgabe:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

Dies ist jedoch wahrscheinlich nutzlos, da in Ihrem lokalen Repository normalerweise nur Zweige erstellt werden.

Die Informationen werden unter ./.git/logs/refs/heads/ branch gespeichert . Beispielinhalt:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

Das letzte Commit in diesem Beispiel stammte vom Benutzer "b", während der Zweig "b2" vom Benutzer "a" erstellt wurde. Wenn Sie Ihren Benutzernamen ändern, können Sie überprüfen, ob git reflog die Informationen aus dem Protokoll übernimmt und den lokalen Benutzer nicht verwendet.

Ich kenne keine Möglichkeit, diese lokalen Protokollinformationen an ein zentrales Repository zu übertragen.


4

Wir können es anhand des Autorennamens herausfinden

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC

1

Angenommen:

  1. Zweig wurde aus gemacht master
  2. hat nicht verschmolzen masternoch

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1

0

Ich weiß, dass dies nicht ganz der Umfang der Frage ist, aber wenn Sie feststellen, dass nur Commits eines bestimmten Autors gefiltert werden müssen, können Sie jederzeit zu grep weiterleiten :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

Viel Spaß beim Codieren! :) :)


0

für diejenigen, die ein DESC suchen ... das scheint zu funktionieren --sort=-

Neu für diese Formatierung ... meine Augen verlieren etwas von ihrem Blut

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

Weitere Referenz: https://stackoverflow.com/a/5188364/10643471


-1

Soweit ich weiß, können Sie sehen, ob Sie nur der Schöpfer eines Zweigs sind. Dies wird durch die erste Zeile in .git / ref / Heads / <branch> angezeigt. Wenn es mit "Created from HEAD" endet, sind Sie der Schöpfer.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.