代码之家  ›  专栏  ›  技术社区  ›  Ibrahim

在svn2git之后,可以从svn中获取更改吗?

  •  9
  • Ibrahim  · 技术社区  · 16 年前

    所以我使用svn2git将一个svn存储库转换为一个git存储库,因为我假设在svn存储库上不会有更多的工作。但是,有人不知道我们要切换到Git(这有点复杂,但他基本上只是在处理一个特定的文件),所以他对SVN做出了一些承诺。现在我想把这些提交提交到git中。我还能这样做吗,还是svn2git完全是单向的?

    如果没有,是否有方法从SVN提交生成补丁,类似于 git format-patch ?我似乎无法从粗略的搜索中找到一个;看起来SVN开发人员从未想过您会希望将提交转换为补丁。

    5 回复  |  直到 13 年前
        1
  •  5
  •   Greg Hewgill    16 年前

    从你的描述来看,似乎只有一些你想要接受的颠覆承诺。最直接的方法是手动提取和应用每个补丁,我将在这里概述。首先,您可以使用 svn diff 提取diff的命令(“diff”在功能上等同于“patch”)。

    svn diff -r 101:102
    

    这将显示101版和102版之间的差异。您可以将此输出重定向到一个文件中,以便在下一步中使用:

    svn diff -r 101:102 >r102.patch
    

    在Git存储库中,从上一步中获取diff并使用 patch 程序:

    patch -p0 <r102.patch
    

    这个 -p0 告诉 补丁 程序如何查找补丁中命名的文件。最后,将更改提交到Git:

    git add -u
    env GIT_AUTHOR_NAME="new name" GIT_AUTHOR_EMAIL="new email" git commit
    

    这个 GIT_AUTHOR_* 环境变量允许您保留原始作者信息,这对于历史记录维护可能很有用。

    上面的内容对于文本文件来说应该足够简单,但是如果Subversion中的任何更改文件恰好是二进制文件,则必须使用稍微不同的技术(在这种情况下,Subversion将拒绝产生有用的差异)。在提交之前,不要提取补丁并应用,只需将每个子版本的文件复制到Git存储库。如果您愿意的话,这对文本文件也可以。

        2
  •  16
  •   anr78    14 年前

    svn2git现在通过--rebase支持这一点。来自(当前)文档:

    从svn2git 2.0开始,有一个新的 引入最新更改的功能 从SVN到Git存储库 使用svn2git创建。这是一个 方式同步,但允许您使用 svn2git作为您的镜像工具 SVN存储库。

    要调用的命令是:

    $ cd <EXISTING_REPO> && svn2git --rebase
    
        3
  •  3
  •   Amber    16 年前

    你可以看看 git-svn .

    完成了Subversion中的手动补丁 via diff .

        4
  •  0
  •   Ibrahim    16 年前

    我发现了另一种方法。我再次运行了svn2git,得到了svn存储库的更新git克隆。然后,在我的旧Git存储库中,我将新的克隆添加为远程,获取它,然后使用 git rebase svnclone2/master 将我的分支重新设置为新更新的svn2git分支。

    当然,这意味着重新平衡的提交具有相同的提交时间,但这并不太糟糕。这比手工做补丁的工作要少,而且由于这个Git存储库还没有被我以外的任何人使用,所以我可以重写历史而不必担心后果。但一般来说,这可能不是一个好的解决方案;最好的办法是让最初的提交者获得Git访问权(他是一个反复无常的粉丝呵呵),让他自己提交补丁。

        5
  •  0
  •   Dmitry Pavlenko    13 年前

    我想你应该用 SubGit 而不是svn2git。当您将其安装到SVN存储库中时

    $ subgit install path/to/svn/repository
    

    它将创建一个Git接口,但SVN接口将保持完全可操作性。每个新的SVN提交都将自动转换为Git提交,反之亦然(转换是并发安全的,因此可以使用任何接口)。