如何通过GitHub删除所有已经“Squash and Merge”的git分支?

时间:2017-04-19 07:32:16

标签: git github merge git-branch git-squash

自GitHub引入Squash and Merge以来,我工作场所的所有酷孩子在合并拉取请求时都在使用它。有没有办法清理“壁球和合并”分支?

How can I delete all git branches which have been merged?中的以下命令不适用于“壁球和合并”:

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

4 个答案:

答案 0 :(得分:2)

没有简单的方法可以自动化,至少不完全。 (可以处理一些特殊情况。)相反,最好的办法是将此分支删除委托给其拉取请求已被压缩合并的人。有几个很好的理由:

  1. 他们是唯一可以确定合并正确完成的人。

    假设,例如,为了压缩合并一系列的六次提交,壁球合并的人必须或选择在某处改变一些角色一两行,出于某种原因好坏。这一行或两行意味着最终提交的总体变化与六个提交中六个变更的总和不同

    但总体结果是否正确?如果您自己没有做任何更改,您将如何知道?

  2. 他们是唯一知道他们是否打算在该分支上继续开发的人。

    仅仅因为feature/tall上的六次提交被压缩为添加到devel的一次提交并不意味着feature/tall 全部完成。他们可能还有几个提交要添加;他们可能希望再次将feature/tall重新加入devel,放弃六个提交的提交,转而支持六个提交壁球,但保留另外三个提交它们即将添加。

    < / LI>

    可能还有一些案例。这些可能都很少见;它们可能永远不会出现在你的项目中但这里的重点是分支feature/tall他们的分支,而不是你的分支,所以他们 - 无论他们是谁 - 应该是那些删除它的人

    请注意,当您选择feature/tall时,您有自己的Git将其重命名为origin/feature/tall(假设您的遥控器名为origin)。如果您正在尝试它,git checkout feature/tall,您的Git会为您制作副本。删除feature/tall并运行git fetch origin --prune后,您的Git会删除您的origin/feature/tall。所以现在问题更简单,可以自动化:find branches whose "upstream" is gone, and delete those。 (这个答案中的一行脚本有一些小缺陷;请参阅注释;一个更好的人会使用git for-each-ref并使用git rev-parse查找每个分支的上游设置,但这可能有点过分。)

答案 1 :(得分:1)

这是一个脚本,该脚本将删除所有已合并为master的壁球分支:

git checkout -q master && git for-each-ref refs/heads/ "--format=%(refname:short)" | while read branch; do mergeBase=$(git merge-base master $branch) && [[ $(git cherry master $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == "-"* ]] && git branch -D $branch; done

如果要进行空运行,则可以运行以下命令:

git checkout -q master && git for-each-ref refs/heads/ "--format=%(refname:short)" | while read branch; do mergeBase=$(git merge-base master $branch) && [[ $(git cherry master $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == "-"* ]] && echo "$branch is merged into master and can be deleted"; done

然后您可以像这样设置别名:

alias gprunesquashmerged='git checkout -q master && git for-each-ref refs/heads/ "--format=%(refname:short)" | while read branch; do mergeBase=$(git merge-base master $branch) && [[ $(git cherry master $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == "-"* ]] && git branch -D $branch; done'

来源:

https://github.com/not-an-aardvark/git-delete-squashed

答案 2 :(得分:0)

这篇文章中的答案也很有用https://medium.com/opendoor-labs/cleaning-up-branches-with-githubs-squash-merge-43138cc7585e

稍微调整以允许任何来源名称并防止删除流行的分支我使用这个:

git fetch --all
REMOTE=$(git remote)
comm -12 <(git branch | sed 's/ *//g') \
  <(git remote prune $REMOTE | sed 's/^.*$REMOTE//g') \
  | grep -v -e main -e master -e develop \
  | xargs -L1 -J % git branch -D %

答案 3 :(得分:0)

工具 git-delete-merged-branches 允许方便地删除分支。我特别喜欢交互模式。

安装(需要 python3):

pip install git-delete-merged-branches

然后执行

git-delete-merged-branches --effort=3

--effort=3 对于删除压扁的分支很重要。

替代方案