如何使用git-svn保持svn:external最新?

作为SVN回购处理我的存储库,我得到:

svn co http://myrepo/foo/trunk foo ... foo/ bar/ baz/ -> http://myrepo/baz/trunk 

把它作为一个Git回购,我得到:

 git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags ... foo/ bar/ 

我可以将baz克隆到我的本地计算机并添加一个符号链接,但这只是一个破解。 有没有办法让git svn rebase在更新其他所有内容时自动拉入这些更改,就像svn up一样?

将svn externals与git-svn整合的最好方法就是这个脚本 ,它将你的外部文件克隆到一个.git_externals /目录下,并创build符号链接并排除你需要的文件。 我觉得这是一个简单而直接的解决scheme。 因人而异。

下面是用git-svn处理svn外部的其他选项的一个较老的概述 。 对我来说,他们看起来有点过于复杂,在后续的Git使用中很容易被破解。

我最终使用的解决scheme只是符号链接到本地​​盒子上的其他git-svn克隆。 这工作得很好:它允许我提交更改,它允许我在项目A上进行本地更改,只是为了让他们进入项目B.

我只写了一个简短的脚本,将当前HEAD所有svn:externals签出到根目录,并将它们从git存储库中排除。

把它.git/hooks/post-checkout上,当工作树发生变化时,例如由于git svn rebasegit-checkout ,它将使外部的签出更新。

 #!/bin/bash set -eu revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p') git svn -r${revision} propget svn:externals | head -n-1 | { while read checkout_args do checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3) svn checkout ${checkout_args} if [ -z $(grep ${checkout_dirname} .git/info/exclude) ] then echo ${checkout_dirname} >> .git/info/exclude fi done } 

我也做了一个脚本(可用的Perl和Ruby变体)为我做这个,它在http://github.com/liyanage/git-tools/

  • recursion检出所有svn:externals
  • 可以重复运行以防大型存储库的克隆中途中止。 发生在我身上很多。 它拾起它离开的地方。
  • 将find并处理的所有svn:externals条目添加到.git / info / exclude
  • 将所遇到的所有svn:ignore项添加到.git / info / exclude中
  • 可以在第一次运行后定期运行,在所有克隆的子沙箱中执行svn:rebase,发现新的外部和新的svn:忽略

更新:我不再维护这个脚本。 它在recursion克隆和更新SVN存储库的function以及其他与git相关的function在我正在积极维护的这个新的项目中可用: http : //liyanage.github.com/git-tools/

只是为了logging:我遵循这个build议,并尝试使用SmartGit处理svn:externals

SmartGit是迄今为止我见过的Git中最好的GUI客户端。 关于svn:externals ,它不仅能够正确地提取它们,而且还提供了对外部存储库进行“快速快照”(只读,只有HEAD的克隆)的选项。

不幸的是,它不是免费的商业用途(我发现许可证价格有点太高 – 是的,我是一个小气鬼)。 尽pipe如此,它也可以用于非商业目的。

我决定写一个“简单的”Perl脚本来处理所有这些东西。 我已经把它最近放到github,试试看,也许它会帮助: http : //github.com/sushdm/git_svn_externals/ 。

它基本上为所有的外部findgit-svn克隆,并且它recursion地寻找它们,克隆,符号链接它们在适当的地方,排除所有.git_externals目录和符号链接,以便您仍然可以使用'git svn dcommit'。

祝你好运。

试试这个python脚本https://bitbucket.org/nytmyn/gitsvnext/overview

结帐svn外部运行以下在你的git仓库

 python /../gitsvnext/run update 

运行这个来知道把什么放到.git / info / exclude

 python /../gitsvnext/run list 

这是我所做的。

首先,我创build了一个空的SVN回购(与git相同的根):

 svn checkout --depth empty http://path/to/repo . 

这在git根目录下创build了空svn回购。 重点是包含SVN外部属性。

接下来,我只检查外部(我放在PATH cygwin工具):

 svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co