使用git svn克隆带有所有外部依赖项的代码库

13

我希望使用 git 克隆一个 svn 仓库,但遗憾的是,svn checkout 可以获取包括所有外部资源的仓库,而 git svn clone 只能获取没有外部资源的仓库。我该如何通过 git svn 获取 svn 仓库中的外部资源?我不想进行复杂的操作,只想获取完整的包含外部资源的仓库。


https://github.com/andrep/git-svn-clone-externals - unhammer
3个回答

10

git-svn不支持externals,但你可以尝试使用SmartGit代替git-svn。它支持svn:externals,将其转换为.gitsvnextmodules文件并显示为模块。唯一的限制是:你应该使用SmartGit克隆存储库,而不是打开已经存在的git-svn存储库。


后续问题:SmartGit支持git-svn吗? - Brent Bradburn
1
部分支持。它有兼容和不兼容模式。在第一个模式中,它完全模拟git-svn(因此不支持外部引用),在第二个模式中,它支持外部引用但不支持git-svn(即git-svn命令将失败,您必须使用UI来处理存储库)。因此,您应该进行选择。 - Dmitry Pavlenko
SmartGit 只创建了一个 .gitsvnextmodules 文件,调用 "git submodule update --init --recursive" 后没有任何反应。因此我认为有些东西出了问题... - user1911091

2

我一直使用git作为访问SVN存储库的前端。SVN中的结构通常非常简单,即有一个顶级目录,其中包含外部引用,而子目录中没有外部引用。此外,一旦添加了外部引用,它们就不会发生太多变化。因此,假设类似于以下内容:

git svn clone X
cd X

我成功地使用以下命令获取了所有的外部资源:

```

git svn show-externals | \
 perl -ne 'if (/^\/(.*) (.*)/) { print "git svn clone $1 $2\n"; }' | \
 bash

我猜想,对于外部结构更为复杂的情况,需要使用一个更复杂的Perl脚本。此外,如果您的外部结构发生变化,您需要再次进行类似的操作。


我发现上述技巧非常有用 - 只是我不得不颠倒$2和$1(本地目录和远程目录)。 - tutuDajuju
@tutuDajuju 很高兴听到它有所帮助。感谢您的评论。我也注意到了这一点,但我还没有花时间调查为什么在某些情况下排序会改变。 - Bowie Owens
也许克隆语法在版本之间发生了变化?今天它是clone $url [$target_dir](dir是可选的) - tutuDajuju
如果外部是相对URL,这似乎无法工作。 ^/OS/blah/blahgit svn show-externals 中显示为 /trunk/^/OS/blah/blah。此外,git svn clone/trunk/^/OS/blah/blah^/OS/blah/blah 上均无法工作。但是,我当然可以使用完整路径克隆外部。 - Patrick

2

我在这里发布解决方案,它适用于我的情况

git svn show-externals | \
  awk '/^\// { print "git svn clone "$3" ."$1" "$2":HEAD"  }' | \
  bash

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