git svn-克隆具有所有外部的repo

git svn-克隆具有所有外部的repo,git,svn,git-svn,svn-externals,Git,Svn,Git Svn,Svn Externals,我想使用git克隆一个svn存储库,但不幸的是,svn checkout获取带有所有外部的repo,git svn clone只获取没有外部的存储库。如何通过git svn从svn存储库获取外部信息?我不想做任何花哨的事情,只要用外部代码获得完整的回购即可。git svn不支持外部代码,但您可以尝试代替git svn。它支持svn:externals,将它们转换为.gitsvnextmodules文件并显示为模块。唯一的限制:您应该使用SmartGit克隆存储库,而不是打开现有的git svn存

我想使用git克隆一个svn存储库,但不幸的是,
svn checkout
获取带有所有外部的repo,
git svn clone
只获取没有外部的存储库。如何通过
git svn
从svn存储库获取外部信息?我不想做任何花哨的事情,只要用外部代码获得完整的回购即可。

git svn不支持外部代码,但您可以尝试代替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脚本。此外,如果您的外部环境发生变化,您将需要再次执行类似操作。

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

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

我发现上面的技术非常有用——除了我必须反转$2和$1(本地dir和远程)@tutudaju很高兴听到它有帮助。谢谢你的评论。我也注意到了这一点,但我还没有花时间研究为什么在某些情况下顺序会发生变化。也许克隆语法在不同版本之间发生了变化?今天它是clone$url[$target_dir](dir是可选的)如果外部url是相对url,那么它似乎不起作用
^/OS/blah/blah
显示为
/trunk/^/OS/blah/blah
git svn show externals
。此外,
git svn clone
/trunk/^/OS/blah/blah
^/OS/blah/blah
上都不起作用。但是,我当然可以使用完整路径克隆外部。它有兼容模式和不兼容模式。在第一个版本中,它完全模拟git svn(因此不支持外部),在第二个版本中,它支持外部,但不支持git svn(即git svn命令将失败,您必须使用UI来处理存储库)。因此,您应该选择.SmartGit只创建一个.gitsvenxtmodules,在调用“git submodule update--init--recursive”之后,什么也不会发生。因此,我假设存在一些不正常的情况……doc()中写道“只支持指向目录的外部,不支持指向单个文件的外部('file externals')。”