如何将SVN的差异应用到Git中?

54

我有两个代码仓库,一个在SVN中,另一个在Git中。每当我在SVN中更改了内容,我都希望能够在Git仓库中进行相同的更改。

比如我在SVN仓库中做了一些修改,产生了第125个版本。那么我该如何将这些修改应用到我的Git仓库中(假设我的Git仓库已经更新到第124个版本)?

谢谢。

6个回答

55

我实际上所做的是:

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

1
对不起,这确实是一个非常具体的情况。如果你有困难,我建议你发布一个问题 :( - Andriy Drozdyuk
2
一般来说,git-svn 是将 svn 提交导入(和导出)到 git 存储库的更好方法。它将保留提交消息和作者信息,并处理许多边缘情况,这些情况会破坏此处给出的答案。(当然,如果存在您没有在此处讨论的外部约束条件,则此脚本可能更适合您的情况) - Rich
6
第二行最好使用 svn diff -c 125。这样做可以获取第 125 个版本的变更,而不是当前代码与该版本之间的变更。 - amotzg

19

尝试:

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

如果您想导出特定版本的差异,请参见svn help diff


请参考 http://linux.die.net/man/1/patch 中的 -pnum。特别是在页面中搜索“not specifying -p”这些词。我认为如果您不指定它,补丁将忽略文件路径并仅使用文件名。 - Andriy Drozdyuk

8
如果您要在SVN中生成补丁并稍后在Git中应用它,请不要忘记使用--git命令行选项

--git

启用svn diff的特殊输出模式,旨在与流行的分布式版本控制系统Git实现跨兼容性。

例如,运行

svn diff --git -r 125 > /tmp/patch.diff


svn:无效选项:--git - niken
@Nik 我猜你的svn客户端太旧了。svn --version 的结果是什么? - bahrep
svn 版本 1.6.13 - niken
@Nik 升级到 SVN 1.9 - bahrep

5

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

有git-svn(还有git-hg、git-cvs和git-bzr afaict)。至少使用git-svn,您可以简单地执行以下操作:

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

使用 -s (--stdlayout) 假设标准的 trunk/ branches/ tags/ 布局,但你可以按照任何方式进行布局(请参考 git-svn 的手册)。

映射是双向的,因此您可以像使用本地 (git) 远程一样推送和拉取。无需询问。


请随意添加一个 post-commit hook,在提交后自动进行推送 :) - sehe
这在 Windows 上使用 svn-git 对我不起作用,因为 git apply 失败,无法正确解析 svn 样式的差异的相对路径。 - the_mandrill
1
@the_mandrill 嗯...使用patch -p1(或-p0,或任何需要剥离的内容)?哦等等。这是一个古老的问题。重点是您不需要svn风格的差异。git cherry-pick - sehe
最终我不得不直接使用patch,只是有点失望git apply patch不能做到同样的事情。 - the_mandrill
3
但这与git-svn关系不大。Git-svn使您能够透明地使用Subversion存储库(作为非本地远程)。如果您要在git-svn之外传递SVN风格的差异,请不要责怪git-svn如果无法正常工作,因为git-svn与此无关。 - sehe

2
除了像上面提到的使用patch之外,您还可以考虑设置一个提交后钩子,这样每次提交新内容时就不必再重复此操作。

1
以下对我有用。
来源:如何使用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日志中,您会发现提交消息包含“Signed-off-by”标记。这个标记将被Github和其他人读取,以提供有关提交如何进入代码的有用信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接