git - 列出已通过 rebase merge 的分支

标签 git github

我有一个存储库,其中有很多很多分支,这些分支已通过 github PR 进行 rebase merge 。即使将分支 merge 到 master这将是一个快进,github 坚持做一个真正的 rebase(将按下“merge ”按钮的人归为所有提交的作者)。

我剩下的是这样的:

* (E) [master]
|
* (D')
|
* (C')
|
| * (D) [feat]
| |
| * (C)
|/
|
* (B)
|
* (A)

feat之后已 merge 。

我正在寻找一种方法来以编程方式识别这些“几乎 merge ”的分支,这样我就可以批量清理它们,类似于git branch --all --merged master会向我显示实际上已 merge 的内容(或者,当然,快进到的内容)。

feat的属性使其“几乎 merge ”并符合清理条件的是:

  • 介于feat之间和master ,所有提交都有一个“并行”、“几乎相同”的提交(在本例中, CC'DD' )。
    • 几乎相同的意思是:
      • 相同的差异
      • 相同的提交消息
      • 相同的作者和作者日期(Commit 和 CommitDate 不同)
    • 并行意味着:
      • feat 之间没有提交及其共同祖先 master ( B ,在示例中)在 master 上没有几乎相同的对
      • master 上几乎相同的提交以相同的顺序出现,并紧随共同祖先之后(同样,B 此处)

以下图表表示在此定义下我不会认为“几乎 merge ”的分支:

* (E) [master]
|
* (D')
|
* (C')
|
* (X)
|
| * (D) [feat]
| |
| * (C)
|/
|
* (B)
|
* (A)
* (E) [master]
|
* (D')
|
* (C')
|
| * (D) [feat]
| |
| * (C)
| |
| * (X)
|/
|
* (B)
|
* (A)
* (E) [master]
|
* (D')
|
* (C')
|
| * (X) [feat]
| |
| * (D)
| |
| * (C)
|/
|
* (B)
|
* (A)

我可能可以使用 GitPython 编写脚本来做到这一点,但我希望已经有一些东西可以满足我的需要。

预选赛

  • 我知道 github 有一个“自动删除头分支”的选项。我现在已经在这个存储库上启用了该功能,但很长一段时间都没有启用。因此,有数百个“几乎 merge ”的分支需要清理
  • 如果有人知道如何让 github 在 merge PR 时实现真正的快进,我将永远感激不已(并且会在 ko-fi 上请你喝杯咖啡或类似的东西)

最佳答案

我刚刚编写了一个脚本,利用 git-range-diff 来执行检查:

#!/bin/bash

UPSTREAM_BRANCH=${2:-origin/main}
REMOTE_BRANCHES=$(git branch -r -l origin/* | grep -vE "(HEAD|$UPSTREAM_BRANCH)")
CHECK_BRANCHES=${1:-$REMOTE_BRANCHES}

NUM_BRANCHES=$(echo "$CHECK_BRANCHES" | wc -l)
BRANCH_COUNTER=0

for BRANCH in $CHECK_BRANCHES; do
    BRANCH_COUNTER=$((BRANCH_COUNTER + 1))
    echo -n "[$BRANCH_COUNTER/$NUM_BRANCHES] Commits of branch $BRANCH "

    UNEQUAL_LINES=$(git range-diff $UPSTREAM_BRANCH...$BRANCH | grep -v " = " | wc -l)

    if [ $UNEQUAL_LINES -eq 0 ]; then
        echo "ARE contained in $UPSTREAM_BRANCH."
    else
        echo "are NOT contained in $UPSTREAM_BRANCH."
    fi
done

关于git - 列出已通过 rebase merge 的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61398539/

相关文章:

git - fatal- 'origin' 似乎不是 git 存储库

github - 演示图像未从 README.md 加载

git - 如何将主分支恢复到上游

与内容 API 等效的 GitHub GraphQL

python - 如何使用Python从AWS机器访问Github中的Excel数据

git - 如何在 Visual Studio 中通过 Git 将项目移动到另一个文件夹

git - 从 Git 存储库中拆分子目录并保留子目录中所有文件的历史_now_

java - 如何使用 JGit 做 "git push --mirror ..."的等价物?

git - ssh -vT git@heroku.com 的权限被拒绝(公钥)错误

sql-server - 如何恢复 GitHub Codespaces 容器中的 SQL Server 备份?