如何使用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 rebase
或git-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