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



自Github引入南瓜和合并以来,我工作场所的所有酷孩子都在合并拉力请求时都在使用它。有没有办法清理"南瓜和合并"树枝?

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

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

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

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

update 工具git-delete-Merged-branches对我来说并不擅长。我现在推荐git-town prune-branches

工具git-town提供修剪分支:

git-town prune branches

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

Git Town needs to be configured
? Please specify the main development branch: main

之后,它要求"多年生"分支是主分支以外的分支,应保留。示例是下一个版本等的分支。

? Please specify perennial branches:

然后,它会带有删除:

[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).

替代品

git-delete-Merged-Branches

工具git-delete-Mergend-Cranches允许方便的分支删除。我特别喜欢交互式模式。

安装(需要python3(:

pip install git-delete-merged-branches

然后执行

git-delete-merged-branches --effort=3 --branch main
  • --effort=3对于删除壁草分支很重要。
  • --branch main是必需的(否则使用master(

其他替代方案

  • @teppeis/git-delete-squashed:安装node.js执行npx @teppeis/git-delete-squashed。支持main分支。
  • git-delete-squashed:不维护:main分支的错过功能.. @teppeis/git-delete-squashed是基于此的。

没有简单的方法可以自动化这一点,至少不是完全。(可以处理一些特殊案例。(相反,最好的办法是将这种分支剥落的人委托给其拉动请求已被南瓜合并的人。这样做有几个充分的理由:

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

    例如,假设为了挤压一系列的六名投入, squash-merge必须或选择更改几个字符的人一两行,出于某种原因好是坏。这一行或两行意味着最终提交的总体变化与六个提交中六个变化的总和不同。

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

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

    仅仅因为feature/tall上的六个提交被压缩到devel中的一个提交中,并不意味着feature/tall em 。他们可能还有几个承诺要添加;他们可能想再次将feature/tall重新列入devel,将六个壁炉的投入下降以支持一个六个较高的平方英尺,但是将另外三个提交的投入将。

可能还有更多案例。这些可能都是罕见的;它们可能永远不会发生在您的项目中;但这里的目的是分支feature/tall他们的分支,而不是您的分支,所以他们(无论他们是谁(应该是在完成时删除它的人。

请注意,当您拿起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查找每个分支的上游设置,但这可能是过高的。(

如果您喜欢具有TUI(基于文本的用户界面(的交互式工具,我写了一个名为Git Xcleaner的工具。它可以找到合并的分支,重新构成的分支(使用相同的提交消息提交(,修剪的分支或手动选择的分支。

https://github.com/lzap/git-xcleaner

本文中的答案也很有用https://medium.com/opendoor-labs/cleaning-up-branches-with-githubs-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 %
cd ..
rm -rf <dirname>
git clone <insertgitpath>

最新更新