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.

Ofir Farchy
quelle
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.

Christopher
quelle
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
DarVar
quelle
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
Mike
quelle
1
perfekt für die Schuld in Farben
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamedP
quelle
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.

suryakrupa
quelle
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.

Gustave
quelle
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
tech2504
quelle
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
Dreizack D'Gao
quelle
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! :) :)

Avocadojesus
quelle
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

Rob Biene
quelle
-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.

Kendor
quelle