git-svn可以正确填充svn:mergeinfo属性吗?

时间:2009-04-03 16:03:02

标签: svn git merge git-svn

我正在评估git-svn并尝试确定它与特定svn存储库的匹配程度。我主要关心的是让git-svn执行合并,以便在subversion repo中正确设置svn:mergeinfo属性。这可能吗?

这是我到目前为止所做的:

# Checkout the SVN repo.
$ git svn clone svn://server/project1 -T trunk -b branches -t tags

# Make sure we are working on trunk.
$ git reset --hard remotes/trunk

# Modify the working copy.
$ vim file.txt

# Commit locally to the git repo.
$ git commit -a

# Push the commits back to the SVN server.
$ git svn dcommit
Committing to svn://server/project1/trunk ...
    M   file.txt
Committed r178
    M   file.txt
r178 = b6e4a3a0c28e7b9aa71d8058d96dcfe7c8a2b349 (trunk)

现在,我将如何将该特定提交合并到一个subversion分支中?同样,对我来说非常重要的是git在提交更改时正确设置了svn:mergeinfo属性。

4 个答案:

答案 0 :(得分:52)

尽管这是一个老问题,但自从被问到以来,git-svn的当前状况已经发生了变化。具体来说,在git 1.7.5中,当提交回svn时,对设置svn:mergeinfo的支持有限。

git svn dcommit现在接受-mergeinfo=<mergeinfo>标记。引用1.7.5+ man page

  

-mergeinfo = LT;合并信息&GT;

     
    

在dcommit期间添加给定的合并信息(例如--mergeinfo =“/ branches / foo:1-10”)。所有svn服务器版本都可以存储此信息(作为属性),从1.5版开始的svn客户端可以使用它。 git svn目前不使用它,也不会自动设置它。

  

虽然使用它时应该非常小心。即使手册页上写着“添加”,它的真正含义是“替换”。也就是说,svn:mergeinfo属性是根据传递的内容设置的,它不会将指定的修订添加到现有的svn:mergeinfo。从我的错误中学习......

编辑:

看起来他们仍在努力进一步改善这一点。从git-svn 1.7.7开始,以下文本被添加到git-svn手册页中:

  
    

config key:svn.pushmergeinfo

  
     

此选项将导致git-svn尝试在可能的情况下自动填充SVN存储库中的svn:mergeinfo属性。目前,这只能在提交非快进合并时才能完成,其中除第一个之外的所有父级已经被推入SVN。

答案 1 :(得分:12)

简短回答:不,git-svn不关心svn:mergeinfo属性,因为git-svn没有合并回svn(它正在进行提交)。

答案很长:大多数人使用git-svn来摆脱大脑损坏的svn合并。 svn的问题在于它不区分复制文件或文件夹(通常由重构引起)和创建分支,因为创建分支或标记是通过使用“svn copy”命令完成的。 svn:mergeinfo属性是这个问题的创可贴,但仍然存在修改含糊不清的情况。 Git对分支和合并有更强大的支持。

答案 2 :(得分:6)

好像他们正在努力。在下一个版本中可能有可能:

http://git.kernel.org/?p=git/git.git;a=commit;h=6abd9332f97441a568421ba233ad8929b50a7efc

答案 3 :(得分:1)

理论部分

问题在于Subversion和Git具有明显不同的合并跟踪机制。

结果,某些合并信息无法从Subversion正确转换为Git。例如,当SVN甚至在子目录级别跟踪它们时,Git根本不跟踪樱桃选择。

另一方面,在Subversion中表示Git合并历史没有问题。但请注意,由于某些SVN文件/目录属性不存在于Git存储库中(例如svn:keywords),一旦您提交合并提交,这些属性的修改将在SVN存储库中丢失。

实用部分

git-svn不会根据Git commit的所有父项自动设置svn:mergeinfo属性。但是,您可以在提交相应的提交之前手动指定属性的值。

查看SubGit,git-svn的服务器端替代品。它在可能的情况下在两个方向上转换合并信息。它还支持svn:ignore,svn:eol-style和svn:mime-type等SVN属性。

有关详细信息,请参阅SubGit documentationSubGit vs. git-svn比较。

SubGit是一种商业产品,提供开源,学术和小型项目的免费选项。我是SubGit开发人员之一。