繁体   English   中英

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

[英]Can git-svn correctly populate svn:mergeinfo properties?

我正在评估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属性。

尽管这是一个老问题,但自从被问到以来,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。

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

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

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

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

理论部分

问题是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文档SubGit与git-svn比较。

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

暂无
暂无

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

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