リポジトリを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
がそれらの変更を自動的に取得する方法はありますか?
私が最終的に使用した解決策は、私のローカルボックス上の他のgit-svn
クローンにシンボリックリンクすることでした。これはかなりうまくいきました。変更をコミットして戻すことができ、プロジェクトAでローカルに変更を加えて、プロジェクトBに変更を加えることができます。
私もこれを行うスクリプト(PerlとRubyバリアントが利用可能)の両方を作成しました http://github.com/liyanage/git-tools/ にあります=。
更新:このスクリプトはもうメンテナンスしていません。 SVNリポジトリーを再帰的に複製および更新するためのその機能、および他のgit関連の機能は、私が積極的に保守しているこの新しいプロジェクトで使用可能です http://liyanage.github.com/git-tools/
現在のHEAD
のすべてのsvn:externals
をルートディレクトリにチェックアウトし、それらを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
}
これが私がやったことです。
最初に、空のSVNリポジトリ(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
これを試してくださいpythonスクリプト https://bitbucket.org/nytmyn/gitsvnext/overview
svn externalsをチェックアウトするには、gitリポジトリで以下を実行してください
python /../gitsvnext/run update
これを実行して、.git/info/excludeに何を置くかを知ってください
python /../gitsvnext/run list
私はこのすべてのものを処理するために「単純な」Perlスクリプトを書くことにしました。私は最近それをgithubに置きました、それを試してみてください、多分それは役立つでしょう http://github.com/sushdm/git_svn_externals/ 。
見つかったすべてのエクスターナルに対して基本的にgit-svn cloneを行い、再帰的に探してクローンを作成し、適切な場所にシンボリックリンクし、すべての.git_externalsディレクトリとシンボリックリンクを除外して、「git svn dcommit」を引き続き使用できるようにします。
幸運を。