有没有脚本可以列出我创建的git分支?

110
我知道分支并不真正存储创建者信息 - 它们只是指向提交的指针。
我的目标是清理已合并到主分支的旧分支,并列出尚未完成此操作的分支(进行清理)。
这与“查找未合并的分支”不同,因为我想找到已合并的分支,并且我想按作者进行操作。
我的问题是:是否有脚本可以列出由我创建的git分支?

你的问题标题和正文似乎有矛盾:你想获取由你创建的分支(我认为你不能这样做),还是想列出未合并的分支?或者两者兼而有之? - morxa
可能是 git 找到未合并分支 的重复问题。 - gzh
我两个都想要。我想要由我创建的所有分支 - 已合并或未合并的。 - hawkeye
1
没有关于谁在 git 中创建任何分支的信息。时间段。所以简短的回答是 没有 - Romain Valeri
我猜这个问题可能更多地涉及到查找你贡献过的分支。也就是说,自从分支点以来,有一个由你编写的提交存在于该分支上。 - Daniel Stevens
8个回答

128

此命令列出所有分支及其作者名称

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

如果你正在使用GitHub,你也可以访问https://github.com/author/repo/branches/yours获取所有的分支。

如果你想要删除所有已经合并的分支,你可以使用以下命令。

git branch --merged | grep -v "\*" | grep -v master | grep -v dev | xargs -n 1 git branch -d

了解更多关于 git for-each-ref 的详细信息,请访问此处


3
除了通过grep管道限制到仅我的方式,还有更好的方法吗? - hawkeye
4
这并没有回答问题。OP明确表述了问题:“我的问题是:有没有一种脚本可以列出我创建的git分支?”这个回答是不够充分的。 - Caleb Adams
7
这个列表列出了分支,但没有按照它们的作者排序。它们是根据每个分支最后一次提交的作者进行排序,而不是分支作者。 - Janez Lukan
2
对我来说什么都没有显示,所以我将其更改为:git for-each-ref --format="%(if)%(authorname)%(then)%(authorname)%(end): %(refname)" --sort=authorname 这个想法来自于 https://git-scm.com/docs/git-for-each-ref。 - JohnnyFun
1
将结果通过管道传输到grep进行过滤,以过滤出其他行:git for-each-ref --format=' %(authorname) %09 %(refname)' --sort=authorname | grep Andrew - Andrew
显示剩余5条评论

37

虽然来晚了一点,但是这是在谷歌上搜索“列出作者的git分支”时的最高结果。

找到你的git远程分支的一行代码为:

git branch -r | xargs -L1 git --no-pager show -s --oneline --author="$(git config user.name)"

git branch -r - 列出所有远程分支。

xargs -L1 - 将上一个命令的结果转换为下一个命令的参数。

git show - git show,显示git中各种类型的对象。在这种情况下,它将显示每个分支上最新的提交,并显示完整的差异。

选项-s抑制差异输出。

选项--oneline将提交信息压缩成一行。

选项--author="$(git config user.name)"只显示当前git用户的提交。

选项--no-pager运行不带翻页程序的git。如果没有这个选项,结果的每个提交都将在自己的翻页程序实例中打开,这取决于您的翻页程序。

最终结果将类似于以下内容:

efbd5d738b (origin/feature/A) commit feature A
297e83d9a6 (origin/feature/B) commit feature B
951f6638de (origin/test/A) commit test A
307d16741b (origin/master) latest master commit

请注意,如果给定的作者是主分支和开发分支的最新提交者,列表将包含这些分支。


有趣的是,这非常慢。我认为这是因为与远程进行了实际通信。只要您对整个存储库进行拉取,我希望这会像闪电般快速,所有必要的数据都在本地,不是吗? - gravidThoughts
1
尝试查看慢性能。似乎是 --author-s 标志是主要罪魁祸首。没有这些标志,脚本是响应的,但在更大的存储库上打印结果需要一段时间。无法在网上找到任何建议为什么它们很慢或任何更快的替代方法。也许会考虑向 Git 维护人员报告这些标志的速度。我感觉它们只是抑制了一些输出。它们仍然似乎在后台处理所有分支和所有差异。 - Skillzore
我的输出包含了一个针对远程分支检出的错误信息:fatal: unrecognized argument: ->。这是因为 git branch -r 在该分支上打印出了 origin/HEAD -> origin/master。我想你可以通过管道传递 grep -v -- '->' 来避免这种情况。 - Noumenon
3
@Noumenon 我也是。通过在第一个术语中添加格式来修复它:git branch -r --format='%(refname)' | ... - Rhubarb
至于得票最高的答案,这并不是 OP 想要的。顺便说一下,OP 想要的在 git 中是无法实现的设计。 - Romain Valeri

15

尝试了上面“SachinSunny”回答的答案,做了修改:

git for-each-ref --sort=authorname --format "%(authorname) %(refname)"

这提供了作者和分支,包括本地和远程分支,并按“最后作者”排序。


5

作为SachinSunny上面答案的简单总结,您可以使用grep的正则表达式功能来完成更简单的命令:

git branch --merged | grep -Pv "\*|master|dev" | xargs -n 1 git branch -d

3

对于 Git 版本 2.23,你只需输入:

git branch

就会列出本地分支列表。请记住,这也将包括 master 和其他已合并的分支。要过滤它们,请使用管道符将结果与 egrep -v "(^\*|master|development) 进行连接。

如果你想包含远程分支,则可以执行以下操作: git for-each-ref --format=' %(authorname) %09 %(refname)' --sort=authorname | egrep -v "(^\*|master|development)"| grep 'Your Name'

如果要删除,请使用 xargs git branch -D


1

这个命令与被接受的答案基本相同,但使用| while read更加方便。

git for-each-ref --format='%(authorname),%(refname:lstrip=3),%(refname:short)' --sort=authorname | while IFS=',' read author branch remote_branch; do
  printf "%20s | %40s | %s\n" "$author" "$branch" "$remote_branch"
done

输出: 输入图像描述


0
这个命令很有用,可以显示当前的分支。
git ls-remote --heads origin

在此输入图像描述 这个命令对于在不需要将整个存储库克隆到本地的情况下获取远程存储库中可用分支的概览非常有用。


-1

这将列出当前已合并未合并的分支,但不一定仅由您创建(这不是完全您想要的,但如果您知道只有一个分支不是由您创建的,那么它可以很有用 - 否则您可以过滤它们 - 所以我还是发布了它),每行一个分支,不包括mastermain以及(因为它将每个分支放在一行上)当前标记的分支(*)(这是指示器:它将打印分支本身):

$ git branch |tr -s ' '|sed -e 's/^ //g' -e 's/ /\n/g' |tr ' ' '\n'|grep -vE '^(master|main|\*)$'


创建Bash别名,您可能会执行以下操作:
$ alias git-ls-branches="git branch |tr -s ' '|sed -e 's/^ //g' -e 's/ /\n/g' |tr ' ' '\n'|grep -vE '^(master|main|\*)$'"

你也可以将这段代码放在你的.bashrc或等效文件中。

再次强调,这将列出其他人创建的分支,但如果你知道没有其他分支,那么就没问题了...除非我打错了字。


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