我进行了一般的网络搜索,并且在回购转换期间没有发现曾尝试过考虑svn:mergeinfo
帐户。
Some people手动修复合并。对于大型历史记录来说并非如此。
我有简单的合并历史记录,其中branches/dev
合并到trunk
版本(我知道它与官方工作流程建议不同)。
通过合并分支(在我的情况下为trunk
)得到的合并信息:
cd trunk
svn log -g
我在Bash中为输出编写了解析器,生成--splicemap
格式:
uuid=svn:`svn info | sed -n '/UUID: /{s=.*UUID: ==;p;q}'`
fbr=/branches/dev
tbr=/trunk
hunkstate=last-merged
linestate=header
error() {
echo ${BASH_SOURCE[0]}:${BASH_LINENO[0]}: hunkstate: $hunkstate, linestate: $linestate
exit 1
}
svn log -g | while read a1 a2 a3 rest; do
if [[ $linestate = header ]]; then
if [[ $a1 = '------------------------------------------------------------------------' ]]; then
linestate=rev
fi
continue
fi
case $hunkstate in
last-merged)
case $linestate in
rev)
rev=${a1#r}
linestate=merge
;;
merge)
if [[ $a1 = Merged && $a2 = "via:" ]]; then
last_merged=$rev
merged_to=${a3#r}
hunkstate=merge
fi
linestate=header
;;
*) error ;;
esac
;;
merge)
case $linestate in
rev)
rev=${a1#r}
linestate=merge
;;
merge)
if [[ $a1 = Merged && $a2 = "via:" ]]; then
:
else
echo $uuid$tbr@$merged_to $uuid$tbr@$rev $uuid$fbr@$last_merged
hunkstate=last-merged
fi
linestate=header
;;
*) error ;;
esac
;;
*) error ;;
esac
done
接下来我跑:
hg convert --splicemap merge.map svn://$IP/$BASE
下一步我修复了有关分支命名的约定:
$ cat branch.map
default stable
dev default
$ hg convert --branchmap branch.map proj-hg/ proj-fixed
hg glog
看起来不错。有时我只合并选定的部分更改,保留休息到下一个版本。当发生这种情况时,历史看起来很奇怪:
| |
o | changeset: 1988:214b38931712
|\ \ branch: dev
| | | parent: 1987:d3fc2c0f10ec
| | | parent: 1969:8957aab1efa8
| | |
| o | changeset: 1987:d3fc2c0f10ec
| |\| branch: dev
| | | parent: 1964:9277a34e037f
| | | parent: 1986:2194f9f673b1
| | |
| | o changeset: 1974:b06706659b0e
| | |
| | o changeset: 1973:5071aa6f3ee7
| | |
| | o changeset: 1971:f9eea3a18947
| | |
+---o changeset: 1970:20b9cd2fdce8
| | user:
| |
o | changeset: 1969:8957aab1efa8
| |
o | changeset: 1968:921d85f051e1
但这种情况很少见。
将存储库从SVN转换为HG时,是否可以使用svn:merginfo
?