web-dev-qa-db-ja.com

SubversionリポジトリをGitサブモジュールとして使用することはできますか?

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リポジトリをチェックアウトし、それをサブモジュールとして使用する方法があると考えています。

151
davitenio

いいえ。最善の策は、専用の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"
126
richq

私はちょうどこれを経験しました。私は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サブモジュールを使用できます。

8
sherbang

現在、git-svnsvn:externalsをサポートしていません。ただし、次の2つのツールが役立ちます。

  1. SubGit

    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人のコミッター)、アカデミックプロジェクト、およびオープンソースプロジェクトでは無料です。

  1. SmartGit

    SmartGitは、クライアント側でgit-svnを置き換えます。その機能の詳細については、 こちら をご覧ください。

    特に、SmartGitはgitサブモジュールsvn:externalsの両方をサポートしています。それらをリポジトリに混在させることができます。

    SmartGitはプロプライエタリなソフトウェアですが、非商用利用の場合は無料です。

5
vadishev

Rqが言ったことに加えて、別の方法は、サードパーティの「外部」プロジェクト( http://nopugs.com/ext-tutorial )を使用することです。これは、svn外部参照の動作をよりよく模倣します。 。エクスターナルを使用すると、gitまたはsvnリポジトリーを追跡でき、変更をそれらのリポジトリーに上流にプッシュする方が簡単です。ただし、プロジェクトメンバーが個別のパッケージをダウンロードしてインストールする必要があります。

サブモジュールまたは外部モジュールはまだ使用していません。しかし、私は数時間かけてすべての代替案について読んでおり、外観が私のニーズにより適しているようです。 Jon Loeligerによる「Gitを使用したバージョン管理」の第15章( http://oreilly.com/catalog/978059652012 )で、これらおよび他のカスタムメソッドに関する優れた議論があります。 。

4
pcuenca

ピストンはこれをサポートするように書き直されており、その逆、およびSubvresionリポジトリとgit + gitの既存のSubversion URLをサポートしています。

ピストンGithubリポジトリ を確認してください。

残念ながら、リリースされていないようです。

0
Otto

さて、git-remote-testsvn、だから私は次のようなものを推測する

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

動作するはずです。しますか?

0
mcepl