找出一个Git分支创建者


159

我想找出谁创建了一个分支。

我有能力做到这一点:

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

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


7
您无法在git中获得分支作者/创建者。您在这里所做的就是获取分支提示的作者。只要有人将新的提交推送到那里,它就会改变。
sylvain.joyeux,2012年

1
免责声明:此问题/答案中的隐含假设是“在每个分支中只有一个人的工作流程中”。在至少两个同事共享一个分支的其他工作流中,无法通过git获得此信息(分支创建者),并且以上答案可能导致某人做出错误的假设。
RomainValeri

Answers:


56

分支不过是提交指针。因此,它不会跟踪“创建我的人”之类的元数据。你自己看。cat .git/refs/heads/<branch>在您的存储库中尝试。

这样写,如果您真的想在存储库中跟踪此信息,请查看分支描述。它们允许您至少在本地将任意元数据附加到分支。

另外,DarVar在下面的回答也是一种获取此信息的非常聪明的方法。


对我来说,这是.git / refs / heads / <branch>中的“ ref”是复数形式
Jeffrey LeCours 2014年

4
DarVar的答案虽然可能对某些人有用,但它不是准确的答案。这只是做原始问题的作者已经在做的事情的一种更为简洁的方式(即将最后一个提交者的名字添加到分支中)。
豌豆

296

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

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

8
这是提交该分支机构的最后一个人。由于分支只是指向提交的指针。
DarVar 2015年

7
应该在Windows上工作吗?我得到“输入文件指定两次。”
史蒂夫·钱伯斯

27
使用表格格式:(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 }'来自stackoverflow.com/a/3631819的主意-可能需要根据最大日期时间/作者姓名长度来调整awk printf中的数字)
Gary S. Weaver 2015年

15
如果分支上没有任何提交,并且如果它是从master创建的,则“分支的作者”与该分支完全无关,而仅与master上的最后一个提交者无关。如果您从master那里获取更改,并且这是一个快速的过程,那么它将再次成为master上的最后一个提交者,他可能从未在该分支上工作过。
古斯塔夫2015年

9
尽管此答案和命令可能有用,但我认为这是对该问题的误导性答案。这列出了所有在分支上最后提交者的分支上的作者姓名。在许多情况下,实际上并不是分支的创建者。真正的答案是git根本不存储此信息。
豌豆

46

我通过使用--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

1
完美地指责色彩
suarsenegger


8

添加到DarVar的答案中

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

PS:我们使用AWK漂亮地打印了作者和远程分支。


3
仅在作者姓名为单个单词时有效。如果名字和姓氏分开,那么您会看到姓氏而不是分支名称……
Legato

5

您可以通过以下方式找出谁在您的本地存储库中创建了分支

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是否从日志中获取信息,并且不使用本地用户。

我不知道将本地日志信息传输到中央存储库的任何可能性。


4

我们可以根据作者姓名找出答案

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

1

假设:

  1. 分支是由 master
  2. 尚未合并master尚未

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

0

我知道这不完全是问题的范围,但是如果您发现只需要过滤特定作者的提交,则可以始终通过管道传递给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'

祝您编码愉快!:)


0

对于那些寻找DESC的人来说...这似乎有效 --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

进一步的参考:https : //stackoverflow.com/a/5188364/10643471


-1

据我所知,您可能会看到是否仅是分支的创建者。这由.git / ref / heads / <branch>中的第一行指示。如果以“从HEAD创建”结尾,则说明您是创建者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.