2

我一直在使用git-svn与我公司的 svn repo 通信一段时间,没有任何大的头痛。

今天,“头痛”部分发生了巨大的变化:
我一直在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,解决途中的任何冲突。

因为我想确定我真的要针对 repo 上的正确分支,然后我运行git svn dcommit --dry-run它并没有产生任何错误或警告,但告诉我......</p>

Committing to svn://username@$repo-host/$repo-name/$path/branches/new-versioned-release ...

…接着是几diff-tree行。

所以我试图省略--dry-run提交的中途以......</p>

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元数据目录”的解决方案并没有引起的共鸣...... </p>

4

1 回答 1

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所有1s,以这个本地历史结束:

-----------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-releasegit 中时,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

唯一的区别是3⭐️创建第三个 SVN 分支的附加值。

于 2014-08-21T07:35:14.920 回答