我希望使用 git 克隆一个 svn 仓库,但遗憾的是,svn checkout
可以获取包括所有外部资源的仓库,而 git svn clone
只能获取没有外部资源的仓库。我该如何通过 git svn
获取 svn 仓库中的外部资源?我不想进行复杂的操作,只想获取完整的包含外部资源的仓库。
我希望使用 git 克隆一个 svn 仓库,但遗憾的是,svn checkout
可以获取包括所有外部资源的仓库,而 git svn clone
只能获取没有外部资源的仓库。我该如何通过 git svn
获取 svn 仓库中的外部资源?我不想进行复杂的操作,只想获取完整的包含外部资源的仓库。
git-svn不支持externals,但你可以尝试使用SmartGit代替git-svn。它支持svn:externals,将其转换为.gitsvnextmodules文件并显示为模块。唯一的限制是:你应该使用SmartGit克隆存储库,而不是打开已经存在的git-svn存储库。
我一直使用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脚本。此外,如果您的外部结构发生变化,您需要再次进行类似的操作。
^/OS/blah/blah
在 git svn show-externals
中显示为 /trunk/^/OS/blah/blah
。此外,git svn clone
在 /trunk/^/OS/blah/blah
或 ^/OS/blah/blah
上均无法工作。但是,我当然可以使用完整路径克隆外部。 - Patrick我在这里发布解决方案,它适用于我的情况
git svn show-externals | \
awk '/^\// { print "git svn clone "$3" ."$1" "$2":HEAD" }' | \
bash