批量删除已重新建立基础并合并的本地分支

lza*_*zap 6 git github

在我们的团队中,我们保留主分支和开发分支的仅快进合并策略,以防止合并提交地狱

合并提交地狱

合并(或重新设置基础然后合并)后,我不会删除其主题分支,因此最终会有大量此类分支。我可以删除一些:

git branch --merged
Run Code Online (Sandbox Code Playgroud)

这只会向我显示尚未在合并之前重新设置基础的那些。其中有一些我可以清理它们。

我正在寻找一些策略,脚本或提示,以应对重新调整的策略。必须有一个脚本,可以以某种循环的方式从master的topic分支中查找所有提交。请分享 ;-)

谢谢

wta*_*com 7

我想要一些非交互式的东西,可以概括为每个分支不止一个提交。需要注意的是,这尚未经过广泛测试,并且在运行此程序时可能比您对克隆状态的假设更多:

重新定位所有可以干净地重新定位的本地分支:

REBASE_TARGET=upstream/master
for branch in $(git for-each-ref --format="%(refname:lstrip=2)" refs/heads/); do
    git rebase "$REBASE_TARGET" "$branch" || git rebase --abort
done
Run Code Online (Sandbox Code Playgroud)

删除所有已合并的本地分支:

git branch --format="%(refname:lstrip=2)" --merged | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)

  • 真是个好主意。这消除了很多分支,对我来说这是一种非常安全且简单的方法。现在我可以使用其他方法(例如检查科目)来检查其余的。 (3认同)
  • 非常优雅,正是我所寻找的。对我来说,一项调整是将“upstream/master”替换为“origin/master”。 (2认同)

Von*_*onC 4

您有一个脚本可以通过以下方式执行此操作:

  • 获取每个分支的最后一次提交
  • 检查提交是否是 master 历史记录的一部分

这将删除已合并到 master 的 rebased 分支。

last_commit_msg="$(git log --oneline --format=%f -1 $branch)"
if [[ "$(git log --oneline --format=%f | grep $last_commit_msg | wc -l)" -eq 1 ]]; then
Run Code Online (Sandbox Code Playgroud)