`git svn dcommit`在一个分支上失败了

时间:2012-05-29 17:31:37

标签: branch git-svn cherry-pick dcommit

我一直在使用git-svn与我公司的svn回购沟通一段时间而没有任何重大问题。

今天,“头痛”部分发生了巨大变化: 我一直专注于master/trunk,并且需要将大多数(但不是全部!)这些更改集合并到一个新的svn分支中,该分支源自一个预先存在的svn-branch。

基本上这个:

-----------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-releasex提交来自相应分支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 ...
  5. 1,解决途中的任何冲突。
  6. 因为我想确定我真的要在repo上定位正确的分支,然后我运行了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. 现在很明显,这不是实现我想要的正确方法......但我应该如何呢?
    3. 我发现的错误消息的所有内容,不知怎么地与我的情况相似,到目前为止this other stack overflow question并且提出的解决方案“以某种方式[...]吹掉.git/svn元数据目录”并没有与我很好地共鸣

1 个答案:

答案 0 :(得分:0)

有人刚刚投票支持我的旧问题,所以我想我现在分享我是如何做到的。

它的效果非常好。

假设已使用

创建了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所有-----------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') s,结束本地历史记录:

git svn dcommit

当我现在new-versioned-release坐在-----------1--1-----1--------1--1--1--- trunk \ \ 2--2--2--2--2 versioned-release \ \ 3⭐️--1--1--1--1--1--1 new-versioned-release 的git中时,SVN服务器上的历史记录看起来就像我最终想要的那样:

3⭐️

唯一的区别是额外的{{1}}来自创建第三个SVN分支。