我正在尝试将SVN repo转换为多个git repos.到目前为止,我一直在使用git svn clone svn_repo_project_pathSVN中的每个项目.我注意到git似乎没有遵循svn复制操作,因此生成的历史比我预期的要简单得多.假设我的SVN repo看起来像这样:
根
项目b和c在最近复制parent-proj的重组计划与最终从自己的老位置删除它们下根的意图的一部分.当我这样做git svn clone http://svnhost/parent-proj所产生的git仓库丢失所有源自历史/b和/c之前的举动.
这是git-svn的限制还是有一些方法可以让这个历史出现在我的回购中?根据我的有限研究,似乎使用获取已使用git-svn重命名的SVN repo的完整历史记录中filter-branch描述的命令可能有效,尽管在我的情况下有多个父项可能使事情复杂化.可以首先克隆整个仓库,然后从中拆分新的仓库(使用filter-branch?)是一种更好的方法吗?
如果您b或 ,您将不会获得预复制到父项目的历史记录。 将您提供的基本路径解释为您有兴趣提取 SVN 提交的最浅点,从而使 Git 提交相同的内容。由于历史提交在这条路径之下和之外,不会反映它们,所以你不会有那个历史。cgit svn clone http://svnhost/parent-projgit svnbcgit 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 在评论中使用了-sor--stdlayout选项,这可以解释为什么为他们保留了一些历史记录。
如果这是一次性转换(从 SVN 到 Git 的单向移动),那么您可能应该克隆整个存储库,然后您有很好的选择来在 Git 中移动内容以使其看起来像您想要的方式,包括建立历史分支和标签。如果运行的动机filter-branch是节省存储库空间,请确保这实际上会为您节省一些东西,并且值得麻烦。Git 的存储效率非常高。
最后对 Git 克隆中的历史搜索的期望提出警告。使用 Git 查找文件的历史记录git log -C --follow <file-path>通常会很好地定位并向您提供包含重命名和副本的历史记录。不要期望目录也有同样的情况,例如parent-proj/b. Git 跟踪 blob(文件)、(blob 的)树、提交和父提交,但不会像 SVN 那样处理目录或目录副本。
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |