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

转换为git时保留svn复制历史记录,git,git-svn,Git,Git Svn,我正在尝试将SVN回购转换为多个git回购。到目前为止,我一直在为svn中的每个项目使用git svn clone svn\u repo\u project\u path。我注意到git似乎不遵循svn复制操作,因此生成的历史比我预期的要短得多。假设我的SVN回购协议如下所示: 根 a b c 母项目 b c 作为重组工作的一部分,项目b和c最近在父项目下复制,目的是最终从根目录下的旧位置删除它们。当我做git svn克隆时http://svnhost/parent-proj生成的git

我正在尝试将SVN回购转换为多个git回购。到目前为止,我一直在为svn中的每个项目使用
git svn clone svn\u repo\u project\u path
。我注意到git似乎不遵循svn复制操作,因此生成的历史比我预期的要短得多。假设我的SVN回购协议如下所示:

  • a
  • b
  • c
  • 母项目
    • b
    • c
作为重组工作的一部分,项目
b
c
最近在
父项目下复制,目的是最终从根目录下的旧位置删除它们。当我做
git svn克隆时http://svnhost/parent-proj
生成的git回购缺少移动前源自
/b
/c
的所有历史记录


这是git svn的一个限制,还是有什么方法可以让这个历史记录显示在我的回购协议中?从我有限的研究来看,使用如中所述的
过滤器分支
命令似乎可以工作,尽管在我的情况下,有多个家长可能会使事情复杂化。是否可以先克隆整个回购,然后从中拆分出新的回购(使用过滤分支?)是一种更好的方法?

如果
git svn克隆,您将不会获得对
b
c
的父项目历史的预拷贝http://svnhost/parent-proj
git svn
将提供的基本路径解释为您感兴趣的最浅点,以便接收svn提交,并对其进行git提交。由于
b
c
下的历史提交在此路径之外,
git svn
不会镜像它们,因此您不会拥有该历史记录

查看
git svn init--no最小化url选项的文档:

当跟踪多个目录时(使用--stdlayout、--branchs或--tags选项),git svn将尝试连接到Subversion存储库的根目录(或允许的最高级别)。如果整个项目在存储库中移动,此默认值允许更好地跟踪历史记录,但可能会导致存在读取访问限制的存储库出现问题。传递——没有最小化url将允许git svn按原样接受url,而无需尝试连接到更高级别的目录。默认情况下,当只跟踪一个URL/分支时,此选项处于禁用状态(这样做没有什么好处)

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

如果这是一次性转换(从SVN到Git的单向移动),那么您可能应该克隆整个存储库,然后您可以选择在Git中移动内容,使其看起来像您希望的那样,包括建立历史分支和标记。如果运行
过滤器分支
的动机是为了节省存储库空间,那么请确保这实际上会为您节省一些东西,并且值得为此费心。Git在存储方面非常高效


最后一句话是关于在Git克隆中搜索历史的期望。使用
git log-C--follow
查找文件上的历史记录,git通常能够很好地定位并提供包含重命名和副本的历史记录。不要期望目录也一样,例如
父项目/b
。Git跟踪blob(文件)、树(blob)、提交和父提交,但处理目录或目录副本的方式与SVN不同。

即使在移动目录时,我也会得到所有文件的历史记录。我的
git svn clone
还跟踪了被克隆目录之外的项目(它们的来源)。@shadowcroper:你使用的是什么版本的git?我和Patrick有同样的问题我不确定他们是用哪个版本克隆的。我相信它最初是1.7版本(几个月前,debian wheezy发布了当时的最新版本)。然而,我最近使用v1.8.4重新打开了一个历史混乱的项目,它的行为是相同的(一些sha是完全不同的树)。也许SVN服务器版本更重要?我相信这仍然在1.7上。也许你需要一个git复习?今天我想在我的git repo(使用
git svn clone
克隆)中查看函数的历史记录,所以我搜索了stackoverflow,发现它显示了
git-C MyFile
,它将我想要的函数的历史记录返回到原始文件(位于不同的目录中)此文件是从中复制的(原始文件今天仍存在于新目录中,但这些行不再在其中)。首先:svn在项目复制之前是否正确地记住了历史记录?执行
svn日志
svn日志——停止复制
并比较结果。您显然不会有“在Git中移动东西的好选项”。Git处理文件移动的能力比svn差得多。