繁体   English   中英

如何通过 GitHub 删除所有已“压缩并合并”的 git 分支?

[英]How can I delete all git branches which have been "Squash and Merge" via GitHub?

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

以下命令来自如何删除所有已合并的 git 分支? 不适用于“挤压和合并”:

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

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

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

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

    假设,例如,为了壁球合并出六大系列的提交,谁了南瓜合并的人只好,还是选择了在一个或两个线某处更改几个字符,出于某种原因好坏. 那一行或两行意味着最终提交中的整体更改与六个提交中的六个更改的总和不同

    但总体结果是否正确? 如果你自己没有做任何改变,你怎么知道?

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

    仅仅因为feature/tall上的六个提交被压缩成一个添加到devel提交并不意味着feature/tall已经全部完成 他们可能还有更多的提交要添加; 他们可能想再次将feature/tall重新设置到devel ,放弃六个被压缩的提交,转而支持一个 6-commit-squash,但保留他们即将添加的另外三个提交。

可能还有一些情况。 这些可能都很罕见; 它们可能永远不会出现在您的项目中; 但这里的重点是分支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查找每个分支的上游设置,但这可能有点矫枉过正。)

这篇文章中的答案也很有用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 %

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

安装(需要python3 ):

pip install git-delete-merged-branches

然后执行

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

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

备择方案

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

https:\/\/github.com\/lzap\/git-xcleaner<\/a>

cd ..
rm -rf <dirname>
git clone <insertgitpath>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM