繁体   English   中英

git svn dcommit在分支上失败

[英]`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的所需提交。

所以我做了以下事情:

  1. git checkout -b versioned-release-svn remotes/versioned-release
  2. git svn branch new-versioned-release -m "Preparing for merge of XXX"
  3. git checkout -b new-versioned-release-svn remotes/new-versioned-release
  4. 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?!?”和“如何在不失去所做的一切的情况下摆脱困境”之外,我还有两个问题:

  1. 假设我回到git svn dcommit之前:如何将本地分支dcommit到达其计划的目的地?
  2. 现在看来,这显然不是实现我想要的目标的正确方法……但是应该怎么做呢?

我为错误消息找到的所有内容都在某种程度上类似于我的情况,到目前为止, 这是另一个堆栈溢出问题 ,并且建议的解决方案“以某种方式[...] .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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM