5

我们正在使用 git-svn 来管理 SVN 存储库的分支。我们面临以下问题:用户 X 在分支中多次提交后,用户 Y 想使用 git-svn 将分支中的更改合并到主干。我们看到的问题是所有单个合并操作的提交消息看起来好像是由用户 Y 进行的,而分支中的实际更改是由用户 X 进行的。

有没有办法向 git-svn 表明在合并时,使用原始提交消息/作者进行给定的更改,而不是进行合并的人?

4

3 回答 3

13

git-svn 手册页建议您不要使用 merge。""建议你运行 git-svn fetch and rebase (not pull or merge)""。话虽如此,你可以做你喜欢的:-)

这里有2个问题。首先是 svn 只存储commiter,而不是像 git 那样存储补丁的作者。所以当 Y 提交合并到主干时,svn 只记录她的名字,即使补丁是由 X 编写的。这是 git 的一个惊人的特性,非常简单但对开源项目至关重要,因为将更改归因于作者可以避免法律问题在路上。

其次,git 似乎没有使用相对较新的 svn merge 功能。这可能是暂时的事情,因为 git 正在积极开发中,并且一直在添加新功能。但目前,它不使用它们。

我刚刚尝试过使用 git 1.6.0.2,与使用 svn merge 执行相同操作相比,它“丢失”了信息。在 svn 1.5 中,向日志记录和注释方法添加了一个新功能,因此主干上的 svn log -g 将输出如下内容进行合并:

------------------------------------------------------------------------
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line

Merged release-1.0 into trunk
------------------------------------------------------------------------
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line
Merged via: r5

Return 1
------------------------------------------------------------------------
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines
Merged via: r5

Create a branch

在这里,Y 提交 r5,它将分支上 X 的更改合并到主干中。日志的格式并没有那么好,但它在 svn blame -g 上得到了它自己:

       2          Y int main()
       2          Y {
G      4          X   return 1;
       2          Y }

这里假设 Y 只提交到主干,我们可以看到一行被 X(在分支上)编辑并合并。

所以,如果你使用的是 svn 1.5.2,你现在可能最好与真正的 svn 客户端合并。虽然你会在 git 中丢失合并信息,但它通常足够聪明,不会抱怨。

更新:我刚刚用 git 1.7.1 试过这个,看看在此期间是否有任何进展。坏消息是 git 中的 merge 仍然不会填充 svn:mergeinfo 值,因此如果 Subversion 存储库是规范源(它可能是),则不会设置 svn:mergeinfo 并且您将丢失合并信息git mergegit svn dcommit好消息是它git svn clone确实会读取 svn:mergeinfo 属性以构建更好的合并历史记录,因此如果您svn merge正确使用(它需要合并完整的分支),那么 git clone 对 git 用户来说看起来是正确的。

于 2008-09-24T13:48:49.767 回答
6

您可以使用嫁接来教 git 有关未在相关提交对象中表示的合并。

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts

查找此信息很容易:只要找到有问题的合并提交,您就知道$merge_sha1并且$parent1_sha1已经知道了。按照惯例,此类提交的提交消息将包含第二个父提交的 SVN 修订号,您只需将其转换为相应的提交 ID:

git svn find-rev r$revnum $branch

Presto,您拥有创建移植物所需的全部 3 条信息。

于 2008-09-24T14:11:10.413 回答
2

尝试对 git-svn 使用 --add-author-from 和 --use-log-author 选项。

于 2009-08-20T18:27:48.230 回答