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

Seb*_*lis 32 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)
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*and 52

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

git svn dcommit现在接受-mergeinfo=<mergeinfo>国旗.引用1.7.5+手册页:

-mergeinfo = <合并信息>

在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.

  • svn.pushmergeinfo确实是一个天赐之物,因为它允许在Git中进行几乎无痛的合并然后再回到SVN.但是,在当前版本(1.7.8)中,使用Git将SVN分支重新集成回主干时会出现错误.请在此处查看我的问题:http://stackoverflow.com/questions/9700998/git-svn-with-svn-pushmergeinfo-how-to-avoid-self-referencing-mergeinfo-lines (3认同)

Mik*_*per 12

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

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

  • 对于最新版本的SVN(1.5+),长答案是不准确的.SVN _does_完全通过`svn:mergeinfo`属性来区分重构和分支.有些边缘情况可能无法正常工作,但这并不是无法支持基本分支/合并的原因. (10认同)
  • 这个答案不再100%正确...请参阅下面的答案. (4认同)
  • 就像我说的那样,svn:mergeinfo是一个创可贴.Svn在分支领域总是很弱,直到它有一个专门的"分支"命令.我在使用SVN 1.5时经历了无数个小时,并且在合并来自多个分支的数百个文件的更改时不得不手动删除bogus mergeinfo属性数据.SVN在其元数据中没有足够的信息来做出正确的决定.通常,即使没有冲突,我们也会遇到合并冲突.Git更容易,更强大! (2认同)