52

将我的存储库视为 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 克隆到其他地方的本地计算机并添加符号链接,但这只是一个 hack。有没有办法git svn rebase在更新其他所有内容时自动提取这些更改,就像这样svn up做一样?

4

8 回答 8

26

我见过的将 svn externals 与 git-svn 集成的最佳方法是这个脚本,它将你的 externals 克隆到 .git_externals/ 目录中,并创建你需要的符号链接和排除文件。我发现这是一个简单直接的解决方案。YMMV。

这是使用 git-svn 处理 svn 外部的其他选项的较旧概述。在我看来,它们看起来有点过于复杂,并且在随后的 Git 使用中容易崩溃。

于 2008-12-08T21:31:23.233 回答
25

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

于 2009-01-23T18:47:45.377 回答
6

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

将它放置到.git/hooks/post-checkout它会在工作树发生变化时保持这些外部结帐是最新的,例如由于git svn rebaseor 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
}
于 2011-11-07T17:45:02.183 回答
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/

于 2010-04-09T17:42:19.570 回答
2

仅作记录:我遵循了这个建议并尝试使用SmartGit处理svn:externals.

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

不幸的是,它不能免费用于商业用途(而且我发现许可证价格有点太高了——是的,我是个小气鬼)。不过,它可以免费用于非商业目的。

于 2013-01-21T13:46:44.070 回答
1

我决定编写一个“简单”的 perl 脚本来为我处理所有这些事情。我最近把它放到了github上,试试看,也许会有所帮助:http: //github.com/sushdm/git_svn_externals/

它本质上为所有找到的外部对象执行 git-svn clone,它递归地查找它们,克隆它们,将它们符号链接到适当的位置,并排除所有 .git_externals 目录和符号链接,以便您仍然可以使用“git svn dcommit”。

祝你好运。

于 2009-08-18T16:37:35.497 回答
1

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

签出 svn externals 在您的 git 存储库中运行以下命令

python /../gitsvnext/run update

运行它以知道将什么放入 .git/info/exclude

python /../gitsvnext/run list
于 2012-03-10T17:27:19.890 回答
1

这就是我所做的。

首先,我创建了一个空的 SVN 存储库(与 git 相同的根目录):

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

这在 git 根目录中创建了空的 svn 存储库。关键是它包含 SVN 外部属性。

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

svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
于 2015-08-03T03:14:42.800 回答