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

时间:2008-12-08 19:52:07

标签: svn git version-control dvcs

将我的存储库视为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一样?

8 个答案:

答案 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:externals
  • 如果大型存储库的克隆中途中止,则可以重复运行。发生了很多事。它从它停止的地方开始。
  • 将找到并处理的所有svn:externals条目添加到.git / info / exclude
  • 将遇到的所有svn:ignore条目添加到.git / info / exclude
  • 可以在第一次运行后定期运行,在所有克隆的子沙箱中执行svn:rebase,发现新的外部和新的svn:ignores

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

答案 3 :(得分:4)

我刚写了一个简短的脚本,将当前svn:externals的所有HEAD签出到根目录,并将它们从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
}

答案 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