我的产品是IntelliJ的插件。我支持基础IntelliJ平台的几个版本,并为每个版本发布我的插件版本,因为它们的API经常在不同版本之间发生变化。它只是我在研究它,所以我在master中开发,然后为每个其他版本维护一个分支。所以我的回购看起来像这样:
1.6.0 1.6.1-eap1
.... a---b---c--- master
\ \
d-------e--- idea-2017.1
\ \
f-------g--- idea-2016.3
\ \
... ... etc etc
a
是一个稳定版本,已使用1.6.0
标记。 c
是EAP(测试版)版本,已使用1.6.1-eap1
标记。这种方案适用于这两种情况。
我偶尔会想要创建一个不会进入发布渠道的开发版,但是用户可以手动下载并测试他们是否喜欢。我想为每个平台生成一个开发版,因为开发用户可以使用任何IntelliJ版本。我能想到的最好的方法是为dev构建创建一个分支,比如标记1.6.0
(commit a
),然后从提交d
,{{{ 1}}等等我可以将dev分支合并到并创建dev构建。
假设我想编写一个脚本来创建和维护这些分支,我如何从标记f
中找到提交d
,f
等来创建开发构建分支从?
答案 0 :(得分:3)
这是我最终做的事情:
#!/bin/sh
set -e # Automatically abort if any simple command fails
die () {
echo >&2 "$@"
exit 1
}
[ "$#" -eq 2 ] || die "Usage: $0 <branch name> <tag>"
tag_commit=$(git rev-list --abbrev-commit -n 1 $2)
[ "${tag_commit}" = "" ] && die "No commit found for $2"
child_commit() {
git log --graph --pretty=format:"%h %p" --decorate -20 --first-parent $1 | grep $2 | cut -c 3-10
}
branch_2017_1=$(child_commit idea-2017.1 $tag_commit)
[ "${branch_2017_1}" = "" ] && die "No commit found for idea-2017.1"
branch_2016_3=$(child_commit idea-2016.3 $branch_2017_1)
[ "${branch_2016_3}" = "" ] && die "No commit found for idea-2016.3"
branch_2016_2=$(child_commit idea-2016.2 $branch_2016_3)
[ "${branch_2016_2}" = "" ] && die "No commit found for idea-2016.2"
branch_2016_1=$(child_commit idea-2016.1 $branch_2016_2)
[ "${branch_2016_1}" = "" ] && die "No commit found for idea-2016.1"
git branch "$1" $tag_commit
git branch "$1-2017.1" $branch_2017_1
git branch "$1-2016.3" $branch_2016_3
git branch "$1-2016.2" $branch_2016_2
git branch "$1-2016.1" $branch_2016_1
现在我只是更新我的合并和发布准备脚本,以选择接受分支系列名称,我想我会很好。
秘密酱在child_commit
函数中,该函数来自here。
答案 1 :(得分:1)
对于问题&#34;在a
g
最早提交的idea-2016.3
之间找到idea-2017
之内的最早提交,最早提交idea-2017
这不在master
&#34;解决方案是使用命令:
git log --oneline --source --ancestry-path master idea-2017 idea-2016.3 --not 1.6.0
输出在历史上与你的相同:
cf32d9f idea-2017 e
88f264c idea-2016.3 g
5bc9fa1 idea-2017 d
3f460fe idea-2016.3 f
224cac8 master c
67620cd master b
然后找到标有idea-2016.3
的最新行和标有idea-2017
的最新行,这将是您的提交。
请注意,如果由于例如f
中的版本差异导致某些阻止程序问题而导致输出可能不合适,这在后续f'
中已得到修复。所以我仍然会考虑明确标记。
答案 2 :(得分:0)
可能最简单的方法是在shell脚本中维护受支持的版本/分支名称列表?
我之所以这么想,是因为你添加了另一个变化:
1.6.0 eap1 eap2
.... a---b---c---h--- master
\ \ \
d-------e---i--- idea-2017.1
\ \ \
f-------g---j--- idea-2016.3
\ \ \
... ... etc etc
您希望将更改(h
)合并到图表中显示的分支的开头,即h
合并到e
和g
。分支2017.1
将指向e
,这是合并到的正确提交。
你可以做一些事情,回去寻找一个共同的祖先或者其他东西,但我认为这是不必要的复杂,并没有真正为你买任何东西。
另外,如果你只保留一个分支列表,你可以相对容易地停止支持旧版本。