Découvrez un créateur de branche Git

159

Je veux savoir qui a créé une succursale.

Je suis en quelque sorte capable de le faire avec:

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

Cependant, cela renvoie le dernier committer par branche, pas nécessairement la personne qui a créé la branche.

Ofir Farchy
la source
7
Vous ne pouvez pas obtenir un auteur / créateur de branche dans git. Ce que vous faites ici, c'est obtenir l'auteur du conseil de la branche. Cela changera dès que quelqu'un y poussera un nouveau commit.
sylvain.joyeux
1
Avertissement: L'hypothèse implicite dans cette question / réponse est "dans un flux de travail avec une seule personne par branche ". Dans d'autres flux de travail où au moins deux collègues partagent une branche, ces informations (créateur de la branche) ne peuvent pas être obtenues via git, et les réponses ci-dessus pourraient conduire quelqu'un à de fausses hypothèses.
RomainValeri

Réponses:

56

Une branche n'est rien d'autre qu'un pointeur de validation. En tant que tel, il ne suit pas les métadonnées telles que «qui m'a créé». Voir par vous-même. Essayez cat .git/refs/heads/<branch>dans votre référentiel.

Cela dit, si vous aimez vraiment suivre ces informations dans votre référentiel, consultez les descriptions des branches. Ils vous permettent d'attacher des métadonnées arbitraires aux branches, au moins localement.

Aussi la réponse de DarVar ci - dessous est un moyen très intelligent pour obtenir ces renseignements.

Christophe
la source
Pour moi, c'était en .git / refs / heads / <branch> "ref" était au pluriel
Jeffrey LeCours
4
La réponse de DarVar, bien que probablement utile à certains, n'est pas une réponse exacte. C'est simplement une manière plus succincte de faire ce que l'auteur de la question originale faisait déjà (à savoir obtenir le nom du dernier commiter dans une branche).
peabody
296

Liste des branches Git distantes par auteur triées par date de validation:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate
DarVar
la source
8
C'est la dernière personne à s'engager dans cette branche. Puisqu'une branche n'est qu'un pointeur vers un commit.
DarVar du
7
Cela devrait-il fonctionner sous Windows? J'ai eu "Fichier d'entrée spécifié deux fois."
Steve Chambers
27
Avec mise en forme tabulaire: 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 }'(idée de stackoverflow.com/a/3631819 - peut avoir besoin d'ajuster les nombres dans awk printf en fonction de la longueur maximale des noms de date / auteur)
Gary S. Weaver
15
Dans le cas où il n'y a pas eu de commit sur la branche et s'il a été créé à partir de master, "l'auteur de la branche" est totalement indépendant de cette branche mais juste le dernier committer sur master. Si vous apportez des modifications à partir de master et que c'est une avance rapide, c'est à nouveau le dernier committer sur master, qui n'a peut-être jamais travaillé sur cette branche.
Gustave
9
Bien que cette réponse et cette commande soient potentiellement utiles, je pense que c'est une réponse trompeuse à la question. Cela répertorie les noms des auteurs de toutes les branches qui sont le dernier validateur d'une branche. Il y a un certain nombre de circonstances dans lesquelles ce ne serait pas réellement le créateur de la branche. La vraie réponse est que git ne stocke tout simplement pas ces informations.
peabody
46

J'ai modifié les réponses précédentes en utilisant le --sortdrapeau et j'ai ajouté une couleur / mise en forme:

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
la source
1
parfait pour blâmer dans les couleurs
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamedP
la source
8

Ajout à la réponse de DarVar :

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

PS: Nous avons utilisé AWK pour imprimer joliment l'auteur et la branche distante.

suryakrupa
la source
3
cela ne fonctionne que si le nom de l'auteur est un seul mot. Si le prénom et le nom sont séparés, vous verrez le nom de famille au lieu du nom de la branche ...
Legato
5

Vous pouvez savoir qui a créé une branche dans votre référentiel local en

git reflog --format=full

Exemple de sortie:

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

Mais cela est probablement inutile car généralement sur votre référentiel local, vous ne créez que des branches.

Les informations sont stockées dans ./.git/logs/refs/heads/ branch . Exemple de contenu:

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

Le dernier commit de cet exemple provenait de l'utilisateur "b" tandis que la branche "b2" était créée par l'utilisateur "a". Si vous modifiez votre nom d'utilisateur, vous pouvez vérifier que git reflog prend les informations du journal et n'utilise pas l'utilisateur local.

Je ne connais aucune possibilité de transmettre ces informations de journal local à un référentiel central.

Gustave
la source
4

Nous pouvons le découvrir sur la base du nom automatique

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

En supposant:

  1. la branche a été faite de master
  2. n'a pas été fusionné pour masterencore

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1
Trident D'Gao
la source
0

Je sais que ce n'est pas entièrement la portée de la question, mais si vous trouvez le besoin de filtrer uniquement les commits par un auteur spécifique, vous pouvez toujours diriger vers grep :)

# 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'

bon codage! :)

avocatjesus
la source
0

pour ceux qui recherchent un DESC ... cela semble fonctionner --sort=-

ty pour le formatage, nouveau dans ce domaine ... mes yeux perdent une partie de son sang injecté

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

ref: https://stackoverflow.com/a/5188364/10643471

voler une abeille
la source
-1

Autant que je sache, vous verrez peut-être si vous êtes le créateur d'une branche uniquement. Ceci est indiqué par la première ligne dans .git / ref / heads / <branch>. S'il se termine par "Créé à partir de HEAD", vous êtes le créateur.

Kendor
la source