签出本地git存储库中的特定svn版本

时间:2013-09-15 12:46:33

标签: git svn git-svn

我想通过了解svn版本号来结帐特定的办理登机手续。例如,当我使用git-svn clone将subversion存储库克隆到本地git时,我收到以下消息:

r5119 = 1563c2dcb9f456d5ba1ba2c277bf7969c452d18b (refs/remotes/git-svn)
    M   check-svn.c
    M   Makefile
r5127 = 1b656753fe46287f52f29359793b2d8671137f4b (refs/remotes/git-svn)
    M   check-svn.c
r5129 = edd06d73d270769cc46db58d9a1a0a4683c95be1 (refs/remotes/git-svn)
    M   check-svn.c
r5132 = 39bf8333113f1ccc6b839cf944dd88c560509065 (refs/remotes/git-svn)
Checked out HEAD:
  https://svn.myserver.net/check-svn r5132

因此,我们可以看到svn版本标记已知(r5119r5127,...)。

我想要做的是通过了解svn版本号,回到本地git克隆上的svn存储库的旧版本。例如,要执行以下操作:

git checkout r5129

在我的本地svn克隆中获取r5129版本git的代码。

我的问题是,即使我看到标签位置合适,我也看不到如何做到这一点。例如,当我执行git shortlog时,如下所示:

  git-svn-id: https://svn.myserver.net/check-svn@5119 bb18-a6e4ad0ded21
  git-svn-id: https://svn.myserver.net/check-svn@5127 bb18-a6e4ad0ded21
  git-svn-id: https://svn.myserver.net/check-svn@5129 bb18-a6e4ad0ded21
  git-svn-id: https://svn.myserver.net/check-svn@5132 bb18-a6e4ad0ded21

那么,如何轻松地完成这样的功能(如果可能的话,在初始克隆时没有额外的操作)?

2 个答案:

答案 0 :(得分:1)

首先,我要感谢Matthijs P带领我通过他的评论解决问题。

git-svn有一个子命令find-rev,可以链接git哈希标记和svn修订标签(请参阅git-svn {{ 3}}更多)。因此,基本上,从远程svn检出特定修订版是这样做的:

git checkout `git svn find-rev r5127`

要注意,因为你不会在分支上,所以如果你进行修改,就很难合并(除非你先修改它)。

在我的情况下,这只是一个只读访问权限,所以这对我来说没问题。

答案 1 :(得分:1)

如果您不喜欢git svn find-rev的解决方案,可以尝试:

git checkout ':/@5127 '

如果给git一个以:/开头的字符串作为修订版,它将使用最新的提交,其中日志消息与下面的正则表达式匹配。由于git-svn通常会在日志消息中包含修订信息,因此该搜索也适用于此。注意结束引号之前的空格,如果在svn历史记录中有那么多修订,那么将阻止匹配像51271那样的修订;如果你知道你正在寻找的修订版本是最近的,没有那个问题你可以完全忽略引号。