我有一个存储库,其中有很多很多分支,这些分支已通过 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
,所有提交都有一个“并行”、“几乎相同”的提交(在本例中,C
有C'
,D
有D'
)。- 几乎相同的意思是:
- 相同的差异
- 相同的提交消息
- 相同的作者和作者日期(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/