Git转svn:向日志消息添加提交日期

6
当“dcommitting”到svn时,我该如何将作者(或提交者)名称/日期添加到日志消息中?
例如,在Git中的日志消息为:
这是一个不错的修改
我希望在svn中有类似以下的消息:
这是一个不错的修改 ----- 作者:John Doo <John.Doo@company.com> 2010-06-10 12:38:22 提交者:Nice Guy <nguy@acme.org> 2010-06-10 14:05:42
(请注意,我主要关注日期,因为我已经在.svn-authors中映射了svn用户)
是否有简单的方法?需要挂钩吗?其他建议? (另请参见:http://article.gmane.org/gmane.comp.version-control.git/148861
2个回答

3

有一种方法可以通过使用脚本、GIT_EDITOR环境变量和dcommit--edit选项来实现此目的。

将以下内容保存到文件中,我们称其为svnmessage.sh

#!/bin/sh
c=`git rev-parse HEAD`
t=`git cat-file -t $c`
m=`cat "$1"`
if [ "commit" = "$t" ]; then
    o=`git cat-file $t $c`
    o_a=`echo "$o" | grep '^author '`
    o_c=`echo "$o" | grep '^committer '`
    author=`echo "$o_a" | sed -e 's/^author \(.*>\).*$/\1/'`
    authorts=`echo "$o_a" | sed -e 's/^author .*> \([0-9]\+\) .*$/\1/'`
    authordt=`date -d @$authorts +"%Y-%m-%d %H:%M:%S %z"`
    committer=`echo "$o_c" | sed -e 's/^committer \(.*>\).*$/\1/'`
    committerts=`echo "$o_c" | sed -e 's/^committer .*> \([0-9]\+\) .*$/\1/'`
    committerdt=`date -d @$committerts +"%Y-%m-%d %H:%M:%S %z"`
    m="$m
-----
Author: $author $authordt
Committer: $committer $committerdt"
fi
echo "$m" > "$1"

确保脚本可以执行:chmod +x svnmessage.sh。然后像这样运行你的dcommit

GIT_EDITOR="/path/to/script/svnmessage.sh" git svn dcommit --edit

The --edit选项将使用GIT_EDITOR环境变量编辑提交消息,以便在提交到SVN之前进行处理。有关更多信息,请参见git-svngit-var
您可以创建一个别名来使事情变得更加容易:
git config --global alias.dcommit-edit '!GIT_EDITOR="$HOME/bin/svnmessage.sh" git svn dcommit --edit'

然后只需使用git dcommit-edit命令。


该脚本依赖于git-svn.perl如何从git cat-file输出中提取SVN提交消息的方式。相同的技术被用来提取作者和提交者信息。一个简单的提交示例可能如下所示:

$ git cat-file commit 24aef4f
tree eba872d9caad7246406f310c926427cfc5e73c8d
parent 7dd9de9b5c68b9de1fc3b798edbab2e350ae6eac
author User <user@acme.com> 1321054806 -0500
committer User <user@acme.com> 1321054806 -0500

foo-27

脚本通常会将.git/COMMIT_EDITMSG作为参数传递给它;其中的内容将包含用于SVN提交消息的Git提交消息。

谢谢您的详细回答。听起来很棒!但是,我正在运行Windows... 你有Windows的示例吗?此外,这是否仅会更改当前操作的GIT_EDITOR环境变量,还是会永久更改所有后续操作的环境变量? - Daniel Hilgarth
@DanielHilgarth:抱歉,我没有Windows;也许有Windows的人可以尝试一下并提供反馈。使用命令设置GIT_EDITOR(或任何环境变量)只会在该命令中替换GIT_EDITOR,而不会永久更改它。 - Go Dan
谢谢您的评论。我认为编写一个与您的脚本相同的小程序不应该太难 - 至少如果我理解它的话 :) 您能否简要解释一下脚本的一般作用和特别是那些sed命令?一个具体的例子会很有帮助。 - Daniel Hilgarth
更新了答案,并提供了脚本功能的某些信息。sed 's' commands执行正则表达式替换,以提取相关数据。 - Go Dan
谢谢!我写了一个小的C#程序(https://github.com/dhilgarth/Tools/tree/master/GitSvnCommitMessageEnricher),它可以完成同样的工作。还有一个问题:是否可能仅将此附加信息添加到SVN提交消息中,而不改变GIT提交消息? - Daniel Hilgarth
可能不行。git svn 依赖于 Git 的提交消息来“暂存”其工作。或者如果有方法的话,进一步分析 Git 源代码可能会有助于回答这个问题。 - Go Dan

-1

这只是关于更改日志输出格式吗?

git log --pretty="format:%s %an %ae %cn %d"
git help log

不完全正确。这是关于在执行“git svn dcommit”时重写日志的问题。 - Arnauld VM
我明白了。很抱歉误解了,我没有使用过 git-svn 的经验。 - takeshin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接