[英]`git svn dcommit` failing on a branch
我一直在使用git-svn
与公司的svn存储库通信一段时间了,没有任何大的麻烦。
今天,“头痛”部分发生了巨大变化:
我一直在专门处理master/trunk
,需要将大多数(但不是全部!)这些变更集合并到一个新的svn分支中,该分支来自一个先前存在的svn分支。
基本上是这样的:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master/trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
应该变成这样的:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master/trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
\
\
1🍒--1🍒--1🍒--1🍒--1🍒--1🍒 new-versioned-release
其中💩
是不应在new-versioned-release
的提交,而x🍒
是来自各个分支x
的所需提交。
所以我做了以下事情:
git checkout -b versioned-release-svn remotes/versioned-release
git svn branch new-versioned-release -m "Preparing for merge of XXX"
git checkout -b new-versioned-release-svn remotes/new-versioned-release
git cherry-pick ...
每1🍒
,解决了途中的任何冲突。 因为我想确定自己真的要针对回购协议上的正确分支,所以我运行了git svn dcommit --dry-run
,它没有产生任何错误或警告,但告诉我…
Committing to svn://username@$repo-host/$repo-name/$path/branches/new-versioned-release ...
……接着是几条diff-tree
线。
因此,我尝试省略--dry-run
并在提交的一半途中最终导致…
Item already exists in filesystem: File already exists: filesystem '/data/subvroot/$repo-name/db', transaction '20856-g3m', path '/$path/branches/new-versioned-release/some-directory' at /usr/libexec/git-core/git-svn line 862
......和一堆不分级的变化。
除了显而易见的“ WTF?!?”和“如何在不失去所做的一切的情况下摆脱困境”之外,我还有两个问题:
git svn dcommit
之前:如何将本地分支dcommit到达其计划的目的地? 我为错误消息找到的所有内容都在某种程度上类似于我的情况,到目前为止, 这是另一个堆栈溢出问题 ,并且建议的解决方案“以某种方式[...] .git/svn
元数据目录”并没有引起共鸣。我很好...
有人刚刚投票赞成我的老问题,所以我想我现在应该分享我的做法。
它真的很好。
假设已经使用以下命令创建了git存储库
git svn clone \
--prefix svn/ \
--stdlayout \
svn://username@$repo-host/$repo-name/$path
$git_repo_name
更改为git repo,然后运行
git checkout svn/versioned-release
git svn branch new-versioned-release
这将在SVN服务器上产生以下历史记录:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
\
\
3⭐️ new-versioned-release
现在我要跑步
git checkout svn/new-versioned-release
git checkout -b new-versioned-release
# resulting in the following **local** history:
#
# 🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master (tracks 'svn/trunk')
# \
# \
# 2🍒--2🍒--2🍒--2🍒--2🍒--3⭐️ new-versioned-release (tracks 'svn/new-versioned-release')
这是实现我想要的基础。
还有一个额外的提交,因为SVN中的分支与Git中的工作方式不同:创建分支始终意味着一个新的修订版(又名提交),这就是3⭐️
来源。 并不重要,但是就在那里。
现在,我可以git cherry-pick
所有1🍒
git cherry-pick
1🍒
,最后显示以下本地历史记录:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 master (tracks 'svn/trunk')
\
\
2🍒--2🍒--2🍒--2🍒--2🍒--3⭐️--1🍒--1🍒--1🍒--1🍒--1🍒--1🍒 new-versioned-release (tracks 'svn/new-versioned-release')
现在,当我坐在git svn dcommit
new-versioned-release
git svn dcommit
new-versioned-release
上时git svn dcommit
时,SVN服务器上的历史记录看起来像是我想要的最终结果:
🍒---💩---💩---💩--1🍒--1🍒---💩--1🍒---💩---💩--1🍒--1🍒--1🍒---💩 trunk
\
\
2🍒--2🍒--2🍒--2🍒--2🍒 versioned-release
\
\
3⭐️--1🍒--1🍒--1🍒--1🍒--1🍒--1🍒 new-versioned-release
唯一的区别是,从创建第三个SVN分支中获得了额外的3⭐️
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.