所以我使用svn2git将SVN存储库转换为git存储库,因为我假设在svn存储库上不再有任何工作。然而,其他人不知道我们正在切换到git(它有点复杂,但他基本上只是在处理一个特定的文件)所以他做了一些提交给SVN。现在我想把这些提交变成git。我还能这样做,还是svn2git完全单向?
如果没有,有没有办法从SVN提交生成补丁,类似于git format-patch
?我似乎无法从粗略的搜索中找到一个;似乎SVN开发人员从未想过你会想要将提交转换成补丁。
答案 0 :(得分:16)
svn2git现在支持--rebase。来自(当前)文档:
从svn2git 2.0开始,有一个新的 功能可以引入最新的更改 从SVN进入你的git存储库 用svn2git创建。这是一个 方式同步,但允许你使用 svn2git作为你的镜像工具 SVN存储库。
要拨打的命令是:
$ cd <EXISTING_REPO> && svn2git --rebase
答案 1 :(得分:5)
从你的描述中可以看出,Subversion中只有少数提交你想要提取。最直接的方法是手动提取和应用每个补丁,我将在此概述。首先,您可以使用svn diff
命令来提取差异(“差异”在功能上等同于“补丁”)。
svn diff -r 101:102
这将显示修订版101和102之间的差异。您可以将此输出重定向到文件以供下一步使用:
svn diff -r 101:102 >r102.patch
在Git存储库中,从上一步获取diff并使用patch
程序应用它:
patch -p0 <r102.patch
-p0
告诉patch
程序如何查找补丁中指定的文件。最后,将更改提交给Git:
git add -u
env GIT_AUTHOR_NAME="new name" GIT_AUTHOR_EMAIL="new email" git commit
GIT_AUTHOR_*
环境变量允许您保留原始作者信息,这可能对历史记录维护很有用。
上面应该可以很容易地为文本文件工作,但是如果Subversion中的任何更改文件碰巧是二进制文件,你将不得不使用稍微不同的技术(Subversion将拒绝在这种情况下产生有用的diff)。在提交之前,只需将每个Subversion修订版中的文件复制到Git存储库,而不是提取补丁和应用。如果您愿意,这对文本文件实际上也可以正常工作。
答案 2 :(得分:3)
答案 3 :(得分:0)
我实际上找到了另一种方法。我再次运行svn2git,获得了更新的svn存储库git克隆。然后在我的旧git存储库中,我将新的克隆添加为远程,获取它,然后使用git rebase svnclone2/master
将我的分支重新绑定到新更新的svn2git分支。
当然,这意味着我重新提交的提交具有相同的提交时间,但这并不算太糟糕。它比手动修补补丁的工作少,而且由于这个git存储库还没有被我以外的任何人使用,我可以重写历史而不用担心后果。但这通常不是一个好的解决方案;最好的办法是让原来的提交者获得git访问权限(他是一个善变的粉丝)并让他自己提交补丁。
答案 4 :(得分:0)
我认为您应该使用SubGit而不是svn2git。将其安装到SVN存储库时
$ subgit install path/to/svn/repository
它将创建一个Git接口,但SVN接口将保持完全正常运行。每个新的SVN提交都将自动转换为Git提交,反之亦然(转换是并发安全的,因此可以使用任何接口)。