我的目标是清理已合并到主分支的旧分支,并列出尚未完成此操作的分支(进行清理)。
这与“查找未合并的分支”不同,因为我想找到已合并的分支,并且我想按作者进行操作。
我的问题是:是否有脚本可以列出由我创建的git分支?
此命令列出所有分支及其作者名称
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
的详细信息,请访问此处。
git for-each-ref --format="%(if)%(authorname)%(then)%(authorname)%(end): %(refname)" --sort=authorname
这个想法来自于 https://git-scm.com/docs/git-for-each-ref。 - JohnnyFungit for-each-ref --format=' %(authorname) %09 %(refname)' --sort=authorname | grep Andrew
- Andrew虽然来晚了一点,但是这是在谷歌上搜索“列出作者的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
请注意,如果给定的作者是主分支和开发分支的最新提交者,列表将包含这些分支。
--author
和 -s
标志是主要罪魁祸首。没有这些标志,脚本是响应的,但在更大的存储库上打印结果需要一段时间。无法在网上找到任何建议为什么它们很慢或任何更快的替代方法。也许会考虑向 Git 维护人员报告这些标志的速度。我感觉它们只是抑制了一些输出。它们仍然似乎在后台处理所有分支和所有差异。 - Skillzorefatal: unrecognized argument: ->
。这是因为 git branch -r
在该分支上打印出了 origin/HEAD -> origin/master
。我想你可以通过管道传递 grep -v -- '->'
来避免这种情况。 - Noumenongit branch -r --format='%(refname)' | ...
- Rhubarb尝试了上面“SachinSunny”回答的答案,做了修改:
git for-each-ref --sort=authorname --format "%(authorname) %(refname)"
这提供了作者和分支,包括本地和远程分支,并按“最后作者”排序。
作为SachinSunny上面答案的简单总结,您可以使用grep的正则表达式功能来完成更简单的命令:
git branch --merged | grep -Pv "\*|master|dev" | xargs -n 1 git branch -d
对于 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
。
这将列出当前已合并和未合并的分支,但不一定仅由您创建(这不是完全您想要的,但如果您知道只有一个分支不是由您创建的,那么它可以很有用 - 否则您可以过滤它们 - 所以我还是发布了它),每行一个分支,不包括master
和main
以及(因为它将每个分支放在一行上)当前标记的分支(*
)(这是指示器:它将打印分支本身):
$ git branch |tr -s ' '|sed -e 's/^ //g' -e 's/ /\n/g' |tr ' ' '\n'|grep -vE '^(master|main|\*)$'
$ alias git-ls-branches="git branch |tr -s ' '|sed -e 's/^ //g' -e 's/ /\n/g' |tr ' ' '\n'|grep -vE '^(master|main|\*)$'"
你也可以将这段代码放在你的.bashrc
或等效文件中。
再次强调,这将列出其他人创建的分支,但如果你知道没有其他分支,那么就没问题了...除非我打错了字。