GitリポジトリにSubversionリポジトリをGitサブモジュールとして追加する方法はありますか?
何かのようなもの:
_git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project
_
_https://svn.foo.com/svn/proj
_はSubversionリポジトリを指します。
Subversionリポジトリとやり取りできる_git-svn
_があることは知っています。だから、おそらく_git-svn
_でSubversionリポジトリをチェックアウトし、それをサブモジュールとして使用する方法があると考えています。
いいえ。最善の策は、専用のgitリポジトリにsvnリポジトリのミラーをセットアップすることです。
git svn clone -s http://Subversion.example.com/ mysvnclone
cd mysvnclone
git remote add Origin [email protected]:project.git
git Push Origin master
次に、gitリポジトリをサブモジュールとして元のプロジェクトに追加できます
cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"
Subversionの観点からこれにアプローチすると、svn:externalsとgitサブモジュールの間に概念上の違いが1つあります。 gitサブモジュールは、指定したリビジョンに固定されます。 「上流」が変更された場合、サブモジュールの参照を更新する必要があります。
したがって、アップストリームのSubversionと再同期する場合:
cd /path/to/mysvnclone
git svn rebase
git Push
... gitプロジェクトは、以前にコミットした元のリビジョンを引き続き使用します。 svn HEADに更新するには、使用する必要があります
cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"
私はちょうどこれを経験しました。私はrqと似たようなことをしていますが、少し異なります。私のサーバーの1つをセットアップして、必要なsvnリポジトリのこれらのgitクローンをホストします。私の場合、読み取り専用バージョンのみが必要であり、サーバー上に裸のリポジトリが必要です。
私が実行するサーバーで:
GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc
これにより、ベアリポジトリが設定され、それを更新するためのcronスクリプトがあります。
#!/usr/bin/python
import os, glob
GIT_HOME='/var/www/git'
os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
if not os.path.isdir(git):
continue
os.chdir(os.path.join(GIT_HOME, git))
if not os.path.isdir('svn/git-svn'):
#Not a git-svn repo
continue
#Pull in svn updates
os.system('git svn fetch && git gc --quiet')
#fix-svn-refs.sh makes all the svn branches/tags pullable
os.system('fix-svn-refs.sh')
#Update the master branch
os.system('git fetch . +svn/git-svn:master && git gc --quiet')`
また、これには http://www.shatow.net/fix-svn-refs.sh からのfix-svn-refs.shが必要です。これは主に以下に触発されました: http:// gsocblog .jsharpe.net/archives/12
なぜgit gc
はここで必要ですが、私はgit pull
なし。
そのため、rqの指示に従ってgitサブモジュールを使用できます。
現在、git-svnはsvn:externalsをサポートしていません。ただし、次の2つのツールが役立ちます。
SubGitはサーバー側のソリューションであり、SubversionリポジトリへのGitアクセスを可能にします。詳細については documenation を参照できますが、一般的にSubGitの使用はかなり簡単です:
$ subgit configure --layout auto $SVN_URL $GIT_REPO
上記のコマンドは、SVNプロジェクトのブランチレイアウトを検出し、SVNプロジェクトをミラー化する準備ができた空のベアGitリポジトリを作成します。 〜/ .SubversionディレクトリのSVN資格情報キャッシュに既に保存されていない限り、資格情報を要求される場合があります。 $GIT_REPO/subgit/authors.txt
を調整して、SVN作成者名をGit IDにマッピングすることもできます。
$ subgit install $GIT_REPO
$ ... let initial translation complete ...
$ TRANSLATION SUCCESSFUL
この時点で、新しく作成されたGitリポジトリに接続されたSubversionリポジトリがあります。 SubGitはsvn commit
ごとにSVNリビジョンをGitコミットに変換し、git Push
ごとにGNコミットをSVNリビジョンに変換します。
さらに必要なことは、Gitリポジトリをコミッターが利用できるようにすることです。 git-http-backend を見てください。次に、作成したGitリポジトリを通常のサブモジュールとして追加できます。 SubGitは、Bitbucket Serverのアドオンとしても利用できます。詳細については here をご覧ください。そのため、git-svnなどの外部ツールを使用する必要はありません。
SubGitはプロプライエタリなソフトウェアですが、小規模企業(最大10人のコミッター)、アカデミックプロジェクト、およびオープンソースプロジェクトでは無料です。
Rqが言ったことに加えて、別の方法は、サードパーティの「外部」プロジェクト( http://nopugs.com/ext-tutorial )を使用することです。これは、svn外部参照の動作をよりよく模倣します。 。エクスターナルを使用すると、gitまたはsvnリポジトリーを追跡でき、変更をそれらのリポジトリーに上流にプッシュする方が簡単です。ただし、プロジェクトメンバーが個別のパッケージをダウンロードしてインストールする必要があります。
サブモジュールまたは外部モジュールはまだ使用していません。しかし、私は数時間かけてすべての代替案について読んでおり、外観が私のニーズにより適しているようです。 Jon Loeligerによる「Gitを使用したバージョン管理」の第15章( http://oreilly.com/catalog/978059652012 )で、これらおよび他のカスタムメソッドに関する優れた議論があります。 。
ピストンはこれをサポートするように書き直されており、その逆、およびSubvresionリポジトリとgit + gitの既存のSubversion URLをサポートしています。
ピストンGithubリポジトリ を確認してください。
残念ながら、リリースされていないようです。
さて、git-remote-testsvn
、だから私は次のようなものを推測する
git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
module/bzquips
動作するはずです。しますか?