查找Git分支的创建者

228

我想知道是谁创建了一个分支。

我可以用以下方式部分地完成:

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

然而,这将返回每个分支的最后一名提交者,而不一定是创建该分支的人。


13
在Git中,无法获取分支的作者/创建者。你正在做的是获取该分支头部的作者。一旦有人在那里推送了新的提交,它就会改变。 - sylvain.joyeux
2
免责声明:此问题/答案的隐含假设是“在每个分支只有一个人的工作流中”。在其他至少两个同事共享一个分支的工作流中,这些信息(分支创建者)无法通过git获得,上述答案可能会导致某人产生错误的假设。 - Romain Valeri
13个回答

385

按提交者日期排序列出作者的远程 Git 分支:

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

25
这是对那个分支做出贡献的最后一个人。因为一个分支只是指向一个提交的指针。 - DarVar
7
这个能在Windows上运行吗?我收到了“输入文件被指定了两次”的错误提示。 - Steve Chambers
31
采用表格格式化: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 }'(灵感来自于 https://dev59.com/y3A65IYBdhLWcg3wyh17#3631819 - 可能需要根据最大日期时间/作者名长度调整awk printf中的数字) - Gary S. Weaver
22
如果该分支没有任何提交,并且它是从主分支创建的,那么“该分支的作者”与该分支完全无关,而只是主分支上的最后一位提交者。如果您从主分支合并变更并且它是快进方式,则再次是主分支上的最后一位提交者,可能从未在该分支上工作过。 - Gustave
32
尽管这个答案和命令有其潜在用处,但我认为它对问题的回答是误导性的。它会在所有分支上列出最后提交者的作者名字,而并不一定是创建该分支的人。实际答案是 git 简单地没有存储这些信息。 - peabody
显示剩余15条评论

81

一个分支就是一个提交指针。因此,它不追踪"谁创建了我"之类的元数据。自己看看吧。在你的存储库中尝试cat .git/refs/heads/<branch>

话虽如此,如果你确实想要在存储库中跟踪这些信息,请查看分支说明。它们允许你至少将任意元数据附加到本地分支上。

此外,DarVar的答案是一种非常聪明的获取此信息的方法。


11
DarVar的回答可能对一些人有用,但并不准确。它只是以更简洁的方式完成了原问题作者已经在做的事情(即获取分支上最后提交者的名称)。 - peabody
一个分支只是指针这一说法的确没错,但严格来说并不是它不追踪谁创建了它。当然会追踪!只不过不是该分支的 head(除非该分支只有一个提交)。要找到创建该分支的人,需要查找“第一个”提交的作者。在某些情况下,找到“第一个”提交并不容易,因为分支并不追踪哪个提交是“第一个”。第一个提交简单地说就是具有 git merge-base $BRANCH $BRANCHED 作为父提交的提交。其中 $BRANCH 是该分支,$BRANCHED 是从哪个分支派生的分支。 - CervEd
1
不需要第一个提交者是创建分支的人。它们是完全独立的事情。你也无法真正找出“第一个”提交是什么,因为该分支很可能与其父分支有多个连接。 - ABaumstumpf
@CervEd,您是错误的。我可以为存储库中的所有现有提交创建成千上万个分支 - 我创建了这些分支,但我没有触及这些提交。 - Moberg
在这种情况下,没有“第一次”提交。 - CervEd
显示剩余3条评论

65

我使用--sort标志微调了先前的答案,并添加了一些颜色/格式:

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

2
适合用彩色指责的完美选择 - therealbigpepe

10

在DarVar的回答中补充:

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

附注:我们使用 AWK 来美化作者和远程分支的显示。


3
只有当作者名字是一个单词时,这才有效。如果作者名字分开为名和姓,则你将看到姓而不是分支名称... - Legato
只需移除 %(committerdate),你就不需要其他的东西了。作为奖励,你不必处理多个单词的作者名称: git for-each-ref --format='%(authorname) %09 %(refname)' - TerDale
我曾经对awk的使用感到困惑,后来意识到最简单的方法是用“cut -d' ' -f7-”来替换它。 - Pete

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

8
您可以通过以下方式查找谁在您的本地仓库创建了一个分支:

git reflog --format=full

示例输出:

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

但这可能是无用的,因为通常只有您在本地存储库中创建分支。

信息存储在./.git/logs/refs/heads/branch。 示例内容:

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

在此示例中,最后一次提交是由用户“b”执行的,而分支“b2”是由用户“a”创建的。如果更改您的用户名,您可以验证git reflog从日志中获取信息而不使用本地用户。
我不知道将本地日志信息传输到中央仓库的任何可能性。

6

我们可以根据作者名进行查找

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

git for-each-ref --format='%(authorname),%(creatordate:short),%(if)%(HEAD)%(then)*%(else)%(refname:short)%(end)' refs/remotes/ --sort=creatordate DESC > ../<filename>.csv 这对我很有帮助... - Parag Bangad

5

假设:

  1. 分支是从 master 分支创建的
  2. 尚未合并到 master 分支

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

1

警告!

请注意这些命令显示分支指向的提交数据,因此提交作者可能与分支作者不同。 Git 不存储分支创建者,只存储提交者。


1
我知道这并不完全是问题的范围,但是如果你需要筛选特定作者的提交,你可以通过管道使用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'

愉快编程! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接