如何在git log中显示SVN版本号?

31

我正在自定义我的git日志,使它全部在一行中显示。具体而言,我添加了以下别名:

lg = log --graph --pretty=format:'%Cred%h%Creset - %C(yellow)%an%Creset - %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative

当我运行 git lg 命令时,我看到以下内容:

* 41a49ad - zain - commit 1 message here (3 hours ago)
* 6087812 - zain - commit 2 message here (5 hours ago)
* 74842dd - zain - commit 3 message here (6 hours ago)

然而,我想在那里添加SVN版本号,使其看起来像这样:

* 41a49ad - r1593 - zain - commit 1 message here (3 hours ago)

普通的git log命令会显示SVN修订号,所以我相信这一定是可能的。 我该怎么做?

4个回答

31
考虑使用命令 git svn
  • 它具有与 git log 相似的日志功能: git svn log
  • 它具有 find-rev 选项(从 SHA1 键中检索 SVN 版本)(在 git 1.6.0 中引入)

虽然我不确定您是否可以在一条命令行中结合这两个选项。
可能需要一个脚本(类似于 这个,虽然不完全符合要求,但仍然可以提供一些想法)。


sdaau在评论中添加了示例

一个例子:

git svn find-rev $(git log --max-count 1 --pretty=format:%H)

Adversus在评论中添加了:

请注意,find-rev搜索当前分支,因此如果您在master中,而rxyz发生在另一个分支中,则find-rev将无法找到它。
您可以使用-B(之前)或-A(之后)选项进行更广泛的搜索,请参见git svn find-rev手册章节


2
一个例子:git svn find-rev $(git log --max-count 1 --pretty=format:%H) - sdaau
这些邮件列表的链接已经失效了。你能否用更合适的链接替换它们?例如网络档案馆http://web.archive.org/web/20070615164322/http://lists-archives.org/git/423371-git-svn-add-find-rev-command.html - Rob W
你如何将此命令的结果添加到git日志中?我有一个别名lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit,我该如何插入SVN修订版本号? - thomasb
@thomasb 六年后,不太确定:尝试并询问一个新问题供所有人查看。 - VonC
@VonC 感谢您九年前的回答 ;) 我只是想帮助其他陷入 git-svn 版本控制系统困境的可怜人。 - Adversus
显示剩余4条评论

15

运行:

git rev-parse HEAD

这将为您提供Git提交哈希值。

然后使用该提交哈希值运行:

git svn find-rev <commit_hash>

这将为您提供svn修订版本。


我最喜欢这个答案,因为它似乎最直接。这是我对一行版本的看法:echo "r$(git svn find-rev $(git rev-parse HEAD))"。当然,这可以作为别名使用:rev = !echo "r$(git svn find-rev $(git rev-parse HEAD))" - floer32
我最喜欢这个答案,因为它似乎最直接。这是我对一行版本的看法:echo "r$(git svn find-rev $(git rev-parse HEAD))"。当然,这可以作为别名使用:svnrev = !echo "r$(git svn find-rev $(git rev-parse HEAD))"。这还可以使您更好地模仿svn export:export = !git archive --format zip --output /tmp/$(git svnrev) master - floer32
git svn find-rev 也可以反过来使用,只需指定以 r 为前缀的 SVN 修订号:git svn find-rev r63919 - Flimm
9
也许在您提交答案时这不是真的(或者我有特殊的git/svn版本),但对我来说,只需简单地编写git svn find-rev HEAD也可以工作。 - yngve
实际上,正确的命令似乎应该是 git svn find-rev master,因为您当前可能在另一个分支中,并且如果我没有错的话,svn 与“master”分支同步。 - Jaime Hablutzel
3
只有在你没有本地提交需要推送到SVN时,这才有效。否则它将返回空白! - DavidGamba

10

当你说“正常的git log向你显示SVN修订号”时,我猜你指的是使用git svn处理的存储库,默认情况下会在同步提交的末尾添加这样一行:

git-svn-id: svn://path/to/repository@###### <domain>

就 Git 而言,这只是随机文本,因此我怀疑您是否能够找到一个 % 访问器来读取其中的 ###### 修订号。

在这一点上,你最好的选择就是自己解析纯粹的 git log 输出。以下是一个粗略的起点:

git log -z | tr '\n\0' ' \n' | sed 's/\(commit \S*\) .*git-svn-id: svn:[^@]*@\([0-9]*\) .*/\1 r\2/'

1
VonC的解决方案要简单得多。 - Nick Dowell

8

最终得到了这样的结果:

git svn log --oneline -1 | cut -d '|' -f1

这将提供该仓库的最后一次修订(您可以调整git svn log参数以显示另一个修订版本,但请保留--oneline-1),但会有一个尾随空格(类似于"r9441 "),我认为这应该很容易被清除。

希望有所帮助...


这个不行,这个可以:git svn log --oneline --limit=1 - Andry

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