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

png*_*png 9 git merge github git-branch git-squash

自从GitHub引入Squash和Merge之后,我工作场所的所有酷孩子都在合并拉取请求时使用它.有没有办法清理"壁球和合并"分支?

以下命令如何删除已合并的所有git分支?不适用于"壁球和合并":

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)

Cla*_*lay 44

这是一个脚本,它将删除所有已被壁球合并到 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
Run Code Online (Sandbox Code Playgroud)

如果你想运行一个试运行,你可以运行这个:

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
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

来源:

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

  • 这对我来说非常有效。它删除了几百个分支,留下了我从未完成或处于实验阶段的分支。很好的答案。 (3认同)
  • 这太棒了。我们是否需要担心清理所有带有“_”消息的提交? (3认同)
  • @joshkarges 我最终做的是制作一个 bash 脚本(.sh),然后从 git 别名调用它。请参阅https://github.com/dougthor42/dotfiles/commit/6b65e53822391e150e6163d1648c8947f6f9bd05 (2认同)

kop*_*por 9

更新 (2023-11-30) git-town prune-branches 自 v10.0.0 起已停用,变更日志现在建议git-town sync改为运行。

更新该工具git-delete-merged-branches对我来说不太好用。git-town prune-branches我现在推荐。

工具git-town提供prune-branches

git-town prune branches
Run Code Online (Sandbox Code Playgroud)

然后它会请求主开发分支。您需要选择您的mainmaster分支:

Git Town needs to be configured

? Please specify the main development branch: main
Run Code Online (Sandbox Code Playgroud)

然后要求保留“常年”枝,即主枝以外的枝条。例如下一个版本的分支等。

? Please specify perennial branches:
Run Code Online (Sandbox Code Playgroud)

然后,继续删除:

[main] git fetch --prune --tags
From github.com:JabRef/jabref

[main] git branch -d remove-sav-file
Deleted branch remove-sav-file (was 33c1a869e1).

[main] git branch -d remove-bibtexml
Deleted branch remove-bibtexml (was d21c11337a).
Run Code Online (Sandbox Code Playgroud)

备择方案

git 删除合并分支

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

安装(需要python3):

pip install git-delete-merged-branches
Run Code Online (Sandbox Code Playgroud)

然后执行

git-delete-merged-branches --effort=3 --branch main
Run Code Online (Sandbox Code Playgroud)
  • --effort=3对于删除被压扁的分支很重要。
  • --branch main是必需的(否则master使用)

其他替代方案


tor*_*rek 2

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

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

    \n\n

    例如,假设为了压缩合并一系列六个提交,执行压缩合并的人必须或选择更改一两行中某处的一些字符,无论出于何种原因,无论好坏。那一两行意味着最终提交中的总体更改不同于六次提交中的六次更改的总和。

    \n\n

    但总体结果正确吗? 如果您自己没有进行任何更改,您怎么知道?

  2. \n
  3. 他们是唯一知道自己是否打算继续在该分支上发展的人。

    \n\n

    仅仅因为六个提交feature/tall被压缩为一个添加的提交devel并不意味着feature/tall一切都完成了。他们可能还有更多提交需要添加;他们可能想再次重新建立feature/tall基础devel,放弃六个压缩的提交,转而支持一个六次提交压缩,但保留他们即将添加的另外三个提交。

  4. \n
\n\n

可能还有一些案例。这些可能都很罕见;它们可能永远不会出现在您的项目中;但这里的要点是分支feature/tall他们的分支,而不是你的分支,所以他们\xe2\x80\x94无论他们是谁\xe2\x80\x94都应该是在完成后删除它的人。

\n\n

请注意,当您拿起时,feature/tall您有自己的 Git 将其重命名为origin/feature/tall(假设您的遥控器名为origin)。如果您正在尝试它,并且git checkout feature/tall,您的 Git 会为您制作一个副本。一旦他们删除feature/tall并且您运行git fetch origin --prune,您的 Git 就会删除您的origin/feature/tall. 所以现在问题更简单并且可以自动化:找到“上游”消失的分支,然后删除那些. (这个答案中的一行脚本有一些小缺陷;请参阅评论;一个更喜欢的人会使用git for-each-ref并查找每个分支的上游设置git rev-parse,但这可能有点过大了。)

\n