git-svn“找不到revmap” – 这是什么意思?

当运行git svn clone并且经常在后续的git svn fetch操作中,我得到了许多文件夹的这个消息:

 Couldn't find revmap for <SVN folder URL> 

我的知识库似乎工作正常。 这个消息是什么意思? 我应该关心它吗?

我没有完整的答案,但是这个错误是由git-svn.perl生成的。 (相关的代码path似乎是do_fetch – > make_log_entry – > find_extra_svn_parents – > lookup_svn_merge。)该代码似乎试图查看svn合并提交的svn:mergeinfo属性来找出所有其父提交/分支,希望把它变成一个很好的,在git克隆中的多父合并提交。 如果这个父parsing失败了,你的提交仍然会被提取到git中; 它只是不会有相同的父母信息,否则。

到目前为止,我还没有亲自发现这个错误导致我的当前主要用例,这是一个svn回购转换为git; git-svn已经能够解决实际上对我来说很重要的大合并,迄今为止这些错误似乎仅限于个别的樱桃合并或旧的分支,我不再关心。

实际上,乍一看,在我看来,这些错误大部分来自于svn:mergeinfologging在我所理解的svn中的错误级别的提交。 在svn回购中,我们通常尝试在分支根目录(例如svn / trunk)中loggingsvn:mergeinfo,而git抱怨的情况似乎与属于特定分支子目录的mergeinfo有关,例如在svn / trunk / dir1 。 我不是一个svn专家,但是我目前的启发是如果你有很多svn:mergeinfos不在分支根目录下,你的svn repo或者你的合并过程可能会有些麻烦。 如果这是正确的,git会抱怨是可以理解的。 在我自己的情况下,我认为这些“奇怪”的提交大部分都修改svn:mergeinfo在分支根(例如svn / trunk) subdir级别(例如svn / trunk / dir1)。 git从根级收集任何需要的东西,并抛出一个关于subdir级别的明显无害的错误。

也就是说,在某些情况下,有些人似乎是在报告问题,特别是在git-svn回购中,并非所有分支都被检出的情况下 。

只是想说明 – 实际上在git-svn中有一个隐藏的文件,叫做类似的东西

 .git/svn/refs/remotes/git-svn/.rev_map.00088888-caaa-4444-9999-2222eeeeeee4 

…closuresID是存储库UUID或git-svn-id

这是一个二进制文件,在/usr/lib/git-core/git-svn

 # rev_map: ... # This is the replacement for the rev_db format, which was too big # and inefficient for large repositories with a lot of sparse history # (mainly tags) # # The format is this: # - 24 bytes for every record, # * 4 bytes for the integer representing an SVN revision number # * 20 bytes representing the sha1 of a git commit ... # - Piping the file to xxd -c24 is a good way of dumping it for # viewing or editing (piped back through xxd -r), should the need # ever arise. 

请注意,输出看起来像这样:

 $ cat .git/svn/refs/remotes/git-svn/.rev_map.* | xxd -c24 | head -1 0000000: 0000 0001 33ee 22cc 9933 88aa 44ff 22dd 5566 88ee 66aa bbcc ....5.'..?..J...Zj..`... 

我认为,当你inputgit svn info ,就是查询这个文件,这样你就可以得到一个基于git SHA hash的SVN版本号。 我不知道如何重build它,虽然(重写可能有助于从这个文件中删除条目,而不是100%肯定不是这个)