32

我正在评估 git-svn 并试图确定它在特定 svn 存储库中的表现如何。我最关心的是让 git-svn 执行合并,以使 svn:mergeinfo 属性在 subversion repo 中正确设置。这可能吗?

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

# 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)

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

4

4 回答 4

52

尽管这是一个老问题,但 git-svn 的当前状态在被问到之后已经发生了变化。具体来说,在 git 1.7.5 中,当 dcommitting back to 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. 从我的错误中吸取教训……</p>

编辑:

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

配置键:svn.pushmergeinfo

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

于 2011-05-12T19:48:26.963 回答
12

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

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

于 2009-05-12T19:27:00.170 回答
6

似乎他们正在努力。下一个版本可能会:

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

于 2010-12-16T11:55:54.090 回答
1

理论部分

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

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

另一方面,在 Subversion 中表示 Git 合并历史没有问题。但是这里要小心,因为 Git 存储库中不存在一些 SVN 文件/目录属性(例如 svn:keywords),一旦您提交合并提交,对这些属性的修改就会丢失在 SVN 存储库中。

实用部分

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

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

有关更多详细信息,请参阅SubGit 文档SubGit 与 git-svn比较。

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

于 2012-09-10T17:59:43.457 回答