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

Jam*_*sen 52 svn git version-control dvcs

将我的存储库视为SVN存储库,我得到:

svn co http://myrepo/foo/trunk foo
...
foo/
  bar/
  baz/ -> http://myrepo/baz/trunk
Run Code Online (Sandbox Code Playgroud)

把它作为Git回购处理,我得到:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
  bar/
Run Code Online (Sandbox Code Playgroud)

我可以将baz克隆到其他地方的本地机器并添加一个符号链接,但这只是一个黑客攻击.有没有办法git svn rebase在更新其他所有内容时自动提取这些更改,就像这样svn up做?

Pau*_*aul 25

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

以下是使用git-svn处理svn外部的其他选项的旧概述.对我来说,他们看起来有点过于复杂,并且在随后的Git使用中可能会中断.


Jam*_*sen 24

我最终使用的解决方案只是符号链接到git-svn我本地盒子上的其他克隆.这非常有效:它允许我提交更改,它允许我对项目A进行本地更改,只是为了让它们进入项目B.


tuo*_*nen 6

我刚刚编写了一个简短的脚本,它将所有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
}
Run Code Online (Sandbox Code Playgroud)