将我的存储库视为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
一样?
答案 0 :(得分:24)
将svn externals与我见过的git-svn集成的最佳方法是script,它将你的外部代码克隆到.git_externals /目录中并创建符号链接并排除你需要的文件。我发现这是一个简单而直接的解决方案。 YMMV。
这是使用git-svn处理svn外部的older overview其他选项。对我来说,他们看起来有点过于复杂,并且在随后的Git使用下容易破裂。
答案 1 :(得分:22)
我最终使用的解决方案只是符合我本地方框上其他git-svn
克隆的符号链接。这非常有效:它允许我提交更改,并允许我对项目A进行本地更改,以便将它们转换为项目B.
答案 2 :(得分:4)
我还制作了一个脚本(Perl和Ruby变体都可用)为我做这个,它位于http://github.com/liyanage/git-tools/。
更新:我不再维护此脚本了。它在递归克隆和更新SVN存储库以及其他git相关功能的功能在我正在积极维护的这个新项目中可用:http://liyanage.github.com/git-tools/
答案 3 :(得分:4)
我刚写了一个简短的脚本,将当前svn:externals
的所有HEAD
签出到根目录,并将它们从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
}
答案 4 :(得分:2)
仅供记录:我遵循this建议并尝试使用SmartGit处理svn:externals
。
SmartGit是迄今为止我见过的最好的Git GUI客户端。关于svn:externals
,它不仅正确地获取它们,而且还提供了执行外部存储库的“快速快照”(只读,仅HEAD克隆)的选项。
不幸的是它不能免费用于商业用途(而且我发现许可证价格有点过高 - 是的,我是小气鬼)。但它可以免费用于非商业目的。
答案 5 :(得分:1)
我决定编写一个“简单”的perl脚本来处理所有这些东西。我最近把它放到了github,尝试一下,也许它会有所帮助:http://github.com/sushdm/git_svn_externals/。
它基本上对所有发现的外部都有git-svn克隆,并且它会在适当的位置递归查找它们,克隆,符号链接它们并排除所有.git_externals dirs和符号链接,这样你仍然可以使用'git svn dcommit'。 / p> 祝你好运。
答案 6 :(得分:1)
试试这个python脚本https://bitbucket.org/nytmyn/gitsvnext/overview
结帐svn externals在你的git仓库中运行以下
python /../gitsvnext/run update
运行此命令以了解要放入.git / info / exclude
的内容python /../gitsvnext/run list
答案 7 :(得分:1)
这就是我所做的。
首先我创建了一个空的SVN repo(与git相同的根):
svn checkout --depth empty http://path/to/repo .
这在git root中创建了空的svn repo。关键是它包含SVN外部属性。
接下来我只检查外部(我放在PATH cygwin工具中):
svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co