将svn复制历史记录保留在转换为git时

7
我正在尝试将一个SVN存储库转换为多个git存储库。到目前为止,我一直在为SVN中的每个项目使用git svn clone svn_repo_project_path。我注意到git似乎不遵循svn复制操作,因此生成的历史记录比我预期的要简短得多。假设我的SVN存储库如下所示: root
  • a
  • b
  • c
  • parent-proj
    • b
    • c
项目 b c 最近被复制到 parent-proj 下,作为重组工作的一部分,旨在最终从其旧位置根目录下删除它们。当我执行git svn clone http://svnhost/parent-proj时,生成的git存储库缺少所有在移动之前源自/b/c的历史记录。
这是git-svn的限制还是有办法使这些历史记录显示在我的存储库中?从我的有限调查来看,使用filter-branch命令,如在Getting complete history of an SVN repo that's been renamed using git-svn中描述的,可能有效,尽管在我的情况下有多个父级,这可能会使事情变得复杂。首先克隆整个存储库,然后从中拆分新存储库(使用filter-branch?)是否是更好的方法?

即使文件移动目录,我仍然可以获取所有文件的责备历史。而且我的git svn clone命令还可以跟踪克隆目录之外的项目(它们的原始位置)。 - Shadow Man
2
@ShadowCreeper:你用的是哪个版本的Git?我和Patrick遇到了同样的问题。 - Pylinux
1
也许你需要温习一下 Git?今天我想查看我的 Git 仓库(使用 git svn clone 克隆)中某个函数的历史记录,于是我在 StackOverflow 上搜索并找到了 https://dev59.com/Qm445IYBdhLWcg3wWI-L,它向我展示了 git blame -C MyFile 命令,这个命令给出了我想要的函数的责任历史记录,一直追溯到原始文件(位于不同目录中)被复制到这个文件中(原始文件今天仍然存在于新目录中,但这些行已经不在其中)。 - Shadow Man
我注意到的一件事是,如果你的SVN项目被拆分成几个较小的项目(mainProj/trunk/module[AB] 拆分为 moduleA/trunkmoduleB/trunk),那么在拆分之前的历史记录将无法获取。但是如果整个项目被复制(mainProj/trunk 复制到 newMainProj/trunk),那么你应该能够获取完整的历史记录。 - Shadow Man
2
首先要搞清楚的是:svn在项目复制之前是否正确地记住了历史记录?请执行svn logsvn log --stop-on-copy命令并比较结果。 - Patryk Obara
显示剩余3条评论
1个回答

0

如果你使用 git svn clone http://svnhost/parent-proj,那么你将无法获取 bc 的预复制到父项目历史记录。 git svn 将你提供的基本路径解释为你有兴趣摄取 SVN 提交的最浅点,并为其创建 Git 提交。由于 bc 下的历史提交在此路径之外,git svn 不会镜像它们,因此你将无法获得该历史记录。

请查看 git svn init --no-minimize-url 选项的文档:

当跟踪多个目录(使用 --stdlayout、--branches 或 --tags 选项)时,git svn 将尝试连接到 Subversion 存储库的根目录(或允许的最高级别)。这个默认设置可以更好地跟踪历史记录,如果整个项目在存储库中移动,但可能会在存在读取访问限制的存储库上出现问题。传递 --no-minimize-url 将允许 git svn 接受 URL,而不尝试连接到更高级别的目录。当只跟踪一个 URL/分支时,默认情况下关闭此选项(它没有什么用)。

由于您的clone命令没有指定多个分支(可能是因为您有一个复杂的、多项目或非标准的布局),git svn只克隆涉及该路径及以下的提交。评论中的Shadow Creeper使用了-s--stdlayout选项,这可以解释为什么他们保留了一些历史记录。

如果这是一次单向从SVN到Git的转换,那么您应该克隆整个存储库,然后在Git中有很好的移动选项,使它们看起来符合您的要求,包括建立历史分支和标签。如果运行filter-branch的动机是为了节省存储库空间,请确保这实际上会为您节省一些东西,并且值得麻烦。Git在存储方面非常高效。

在 Git 克隆中搜索历史记录时,需要注意一个最后的警告。使用 git log -C --follow <file-path> 命令查找文件的历史记录时,Git 通常会很好地定位并提供包含重命名和复制的历史记录。但是对于目录(例如 parent-proj/b),不要期望得到相同的结果。Git 跟踪 blob(文件)、blob 的树、提交和父提交,但不像 SVN 那样处理目录或目录副本。


你在 Git 中明确地不会有“移动文件的好选项”。Git 处理文件移动比 svn 差得多。 - Honza

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