git-svn合并并提交详细信息

时间:2020-03-06 14:39:33  来源:igfitidea点击:

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

有没有一种方法可以指示git-svn合并时,使用原始提交消息/作者进行给定的更改,而不是使用进行合并的人员?

解决方案

git-svn手册页建议我们不要使用merge。 ""建议我们运行git-svn提取并变基(而不是拉取或者合并)""。话虽如此,你可以做你喜欢的事情:-)

这里有2个问题。首先是svn仅存储提交者,而不像git那样存储补丁的作者。因此,当Y将合并提交到主干时,即使补丁是由X编写的,svn也会记录她的名字。在路上。

其次,git似乎没有使用相对较新的svn合并功能。这可能是暂时的,因为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责怪-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中的合并仍然不会填充svn:mergeinfo值,因此,git merge后跟git svn dcommit将不会设置svn:mergeinfo,并且如果Subversion仓库是规范的源,我们将丢失合并信息,这可能是。好消息是git svn clone确实读入了svn:mergeinfo属性以构建更好的合并历史记录,因此,如果我们正确使用svn merge(它需要合并完整的分支),则git克隆对git用户而言将是正确的。

我们可以使用嫁接来教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条信息。

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