【问题标题】:How to apply SVN diff to Git?如何将 SVN diff 应用于 Git?
【发布时间】:2009-03-18 18:07:37
【问题描述】:

我的项目位于 2 个存储库中。一个在 SVN 下,一个在 Git 下。 每当我在 SVN 中更改某些内容时,我都想对 Git 存储库执行相同的操作。

假设我对 SVN 存储库进行了更改,生成了修订版 125。我如何将这些相同的更改应用到我的 Git 存储库(假设我的 Git 存储库是最新的修订版 124)。

谢谢。

【问题讨论】:

    标签: svn git version-control patch


    【解决方案1】:

    我实际上做了/寻找的是:

    cd /path/to/svn/repo
    svn diff -r 125 > /tmp/patch.diff
    cd /path/to/git/repo
    patch -p0 < /tmp/patch.diff
    

    【讨论】:

    • 对不起,这确实是具体情况。如果您遇到问题,我建议您发布一个问题:(
    • 一般来说,git-svn 是将 svn 提交导入(和导出)到 git 存储库的更好方法。它将保留提交消息和作者信息,并处理许多会破坏此处给出的答案的边缘情况。 (当然,如果有你在这里没有讨论的外部约束,这个脚本可能更适合你的情况)
    • 第二行使用svn diff -c 125 会更正确。这样,您将获得修订版 125 的更改,而不是当前代码中此修订版的更改。
    【解决方案2】:

    试试:

    svn diff | patch -d /path/to/git/repo -p0
    

    如果您想导出特定修订的差异,请参阅svn help diff

    【讨论】:

    • 参见linux.die.net/man/1/patch 中的-pnum 特别是在页面中搜索“未指定-p”的字词。我想如果你不指定它 - 补丁将忽略文件路径并只使用文件名。
    【解决方案3】:

    如果您打算在 SVN 中生成补丁并稍后使用 Git 应用,请不要忘记使用--git command-line option

    --git

    为 svn diff 启用一种特殊的输出模式,旨在与流行的 Git 分布式版本控制交叉兼容 系统。

    例如,运行

    svn diff --git -r 125 &gt; /tmp/patch.diff

    【讨论】:

    • svn:无效选项:--git
    • @Nik 我猜你的 svn 客户端太旧了。 svn --version 的结果是什么?
    • svn 版本 1.6.13
    • @Nik 升级到 svn 1.9
    【解决方案4】:

    为什么没人喜欢 git-svn?我不能假设没有人知道。

    有 git-svn(还有 git-hg 和 git-cvs 和 git-bzr afaict)。至少使用 git-svn 你可以简单地做

    git svn clone --stdlayout http://myrepo/root here
    

    使用 -s (--stdlayout) 假定标准主干/分支/标签/布局,但您可以使用任何方式 (man git-svn)。

    映射是双向的,因此您可以像使用本地 (git) 远程一样进行推送和拉取。没有问题。

    【讨论】:

    • 随意添加一个提交后挂钩以在提交后进行自动推送:)
    • 这对我在 Windows 上的 svn-git 不起作用,因为 git apply 失败,因为它无法正确解析 svn 样式差异的相对路径。
    • @the_mandrill erm... 使用patch -p1(或-p0,或任何你需要剥离的东西)?等一下。哦,老问题。关键是你不需要 svn 风格的差异。 git cherry-pick
    • 最后我不得不直接使用patch——我很失望git apply patch不能这样做
    • 但这与 git-svn 关系不大。 Git-svn 使您能够透明地(作为非本地远程)使用 Subversion 存储库。如果你要传递 SVN 风格的差异 在 git-svn 之外 你不应该责怪 git-svn 如果那不起作用。它与它无关
    【解决方案5】:

    除了使用上面提到的补丁之外,您还可以考虑设置post-commit hook,这样您就不必每次提交新内容时都这样做。

    【讨论】:

      【解决方案6】:

      以下内容对我有用。

      来源:How to create and apply a patch with Git

      首先,看看补丁有哪些变化。您可以使用 git apply 轻松完成此操作

      git apply --stat fix_empty_poster.patch
      

      请注意,此命令不会应用补丁,而只会显示有关它会做什么的统计信息。使用您喜欢的编辑器查看补丁文件后,您可以看到实际的更改。

      接下来,您对补丁的麻烦程度感兴趣。 Git 允许您在实际应用补丁之前对其进行测试。

      git apply --check fix_empty_poster.patch
      

      如果您没有收到任何错误,则可以干净地应用补丁 ?。否则你可能会看到你会遇到什么麻烦。

      为了应用补丁,我将使用 git am 而不是 git apply。这样做的原因是 git am 允许您签署已应用的补丁。这可能对以后的参考有用。

      git am --signoff < fix_empty_poster.patch
      
      Applying: Added specs to test empty poster URL behaviour
      Applying: Added poster URL as part of cli output
      

      好的,补丁已干净应用,您的主分支已更新。当然,再次运行测试以确保没有任何问题。

      在你的 git log 中,你会发现提交消息包含一个“Signed-off-by”标签。 Github 和其他人将读取此标签,以提供有关提交如何在代码中结束的有用信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2012-09-09
        • 2011-07-02
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多