2008-12-08 134 views
51

治疗我的存储库作为SVN回购,我得到:如何使用git-svn让svn:external保持最新状态?

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/ 

我可以克隆巴兹到我的本地机器上的其他地方,并添加符号链接,但这只是一个黑客。有没有办法让git svn rebase在更新其他所有内容时自动引入这些更改,就像svn up一样?

+0

我知道我在什么地方阅读有关如何使用Git子模块中设置的,但我不能找到链接。 – JesperE 2009-01-23 18:56:19

回答

22

我结束了使用的解决方案是只是符号链接到其他git-svn克隆我的本地框。这工作得很好:它可以让我提交更改回来,它可以让我做项目一个地方的变化只是为了让他们进入项目B.

24

将svn externals与git-svn整合的最佳方法是我看到的script,它将您的外部文件克隆到.git_externals /目录并创建符号链接并排除您需要的文件。我觉得这是一个简单而直接的解决方案。因人而异。

下面是用于处理与混帐SVN SVN的外部其他选项的older overview。对我来说,他们看起来有点过于复杂,并且很容易在随后的Git使用中破解。

+0

这似乎不适合我(这里的外部是相对链接到同一个存储库)。 – 2011-12-05 13:47:18

1

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

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

祝你好运。

4

我还做了一个脚本(包括Perl和Ruby的两种型号),这是否对我来说,这是在http://github.com/liyanage/git-tools/

  • 递归检查出所有的svn:externals的
  • 能的情况下,反复运行大型仓库的克隆中止一半。发生在我身上很多。它从它离开的地方开始。
  • 将所有的svn:externals的条目发现和流程的.git /信息/排除
  • 将所有的svn:忽略它遇到到git的条目/信息/排除
  • 可以定期在第一次运行后运行在所有克隆的子沙盒中执行svn:rebase,发现新的外部和新的svn:忽略

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

+0

我可能无法让你的工具工作。 – 2010-08-03 22:37:30

+1

我想知道什么对你不起作用,所以我可以改进脚本。你能联系我吗? – 2010-08-16 16:19:45

+0

有很多叉子。有谁知道他们哪一个在msysgit的windows上工作?链接的版本只是挂起。 – axk 2012-03-02 14:33:07

4

我刚刚写了一个简短脚本,用于检出当前所有svn:externalsHEAD添加到根目录并将它们从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 
} 
2

只用于记录:我遵循this建议并试图用SmartGit来处理svn:externals

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

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

0

这是我所做的。

首先我创建一个空的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 
相关问题