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.


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.


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

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

1
parfait pour blâmer dans les couleurs
suarsenegger


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.


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.


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

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

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! :)


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.