繁体   English   中英

在svn2git之后,你能从svn获取更改吗?

[英]After svn2git, can you fetch changes from svn?

所以我使用svn2git将SVN存储库转换为git存储库,因为我假设在svn存储库上不再有任何工作。 然而,其他人不知道我们正在切换到git(它有点复杂,但他基本上只是在处理一个特定的文件)所以他做了一些提交给SVN。 现在我想把这些提交变成git。 我还能这样做,还是svn2git完全单向?

如果没有,有没有办法从SVN提交生成补丁,类似于git format-patch 我似乎无法从粗略的搜索中找到一个; 似乎SVN开发人员从未想过你会想要将提交转换为补丁。

svn2git现在支持--rebase。 从(当前)文档:

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

要调用的命令是:

 $ cd <EXISTING_REPO> && svn2git --rebase 

从你的描述中可以看出,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程序如何查找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存储库,而不是提取补丁和应用。 如果您愿意,这对文本文件也可以正常工作。

你可以看看git-svn

Subversion中的手动补丁通过diff完成。

我认为你应该使用SubGit而不是svn2git。 将其安装到SVN存储库中时

$ subgit install path/to/svn/repository

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

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

当然,这意味着我重新提交的提交具有相同的提交时间,但这并不是太糟糕。 它比手动修补补丁的工作少,而且由于这个git存储库还没有被我以外的任何人使用,我可以重写历史而不用担心后果。 但这通常不是一个好的解决方案; 最好的办法是让原来的提交者获得git访问权限(他是一个善变的粉丝)并让他自己提交补丁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM