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


154

GitリポジトリにGitサブモジュールとしてSubversionリポジトリを追加する方法はありますか?

何かのようなもの:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

where https://svn.foo.com/svn/projはSubversionリポジトリを指します。

git-svnSubversionリポジトリとやり取りできるものがあることは知っています。ですから、Subversionリポジトリをチェックアウトgit-svnしてサブモジュールとして使用する方法があるのではないかと考えています。

回答:


127

いいえ。最善の策は、専用のgitリポジトリにsvnリポジトリのミラーを設定することです。

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com: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"

svn:externalsとgitサブモジュールの間には概念的な違いが1つあります。これは、Subversionの観点からこれに近づくと失敗する可能性があります。gitサブモジュールは、指定したリビジョンに固定されています。「上流」が変更された場合は、サブモジュールの参照を更新する必要があります。

したがって、上流のサブバージョンと再同期すると、次のようになります。

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"

1
ここに投稿する前にこれらのコードを試しましたか?サブモジュールはgit svnでは適切に機能しません。
xhan

4
@xhanはい、同じリポジトリでgit-svnとサブモジュールを混在させることは推奨していません。git-svnを使用するクローンは、svnリポジトリーのネイティブgitクローンを作成するためのブリッジにすぎません。
richq 2010

ごめんなさい。サブモジュールとして機能する2つのフォルダーを使用していることは見つかりませんでした。素敵なトリック。
10

素晴らしいテクニック。git-svn repoをそこにプッシュする前に、サーバーで 'git init --bare'ステップは必要ありませんか?私はこれをしなければなりませんでした。
クレイトンスタンレー

おそらくデフォルトではありませんが、gitサブモジュールと同じようにsvn:externalsを特定のリビジョンにバインドできます。
MarcH 2013年

8

私はこれを経験しました。私はrqに似ていますが、少し異なります。サーバーの1つをセットアップして、必要なsvn reposのこれらの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

なぜgit gcここでこれが必要なのかはわかりませんが、git pullた。

したがって、これがすべて終わったら、rqの指示に従ってgitサブモジュールを使用できます。


コミットフックとしてこれを行うことさえできると思う人もいるでしょう。
Andres Jaan Tack

6

現在、git-svnsvn:externalsをサポートしていません。しかし、あなたを助けることができる他の2つのツールがあります:

  1. SubGit

    SubGitはサーバー側のソリューションで、GitがSubversionリポジトリにアクセスできるようにします。詳細についてはドキュメントを参照できますが、一般的にSubGitを使用するのはかなり簡単です。

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    上記のコマンドは、SVNプロジェクトのブランチレイアウトを検出し、SVNプロジェクトをミラーリングする準備ができている空のベアGitリポジトリを作成します。クレデンシャルが〜/ .subversionディレクトリのSVNクレデンシャルキャッシュにすでに保存されていない限り、クレデンシャルを求められる場合があります。$GIT_REPO/subgit/authors.txtSVN作成者名をGit IDにマップするように調整することもできます。

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    この時点で、Subversionリポジトリが新しく作成されたGitリポジトリに接続されています。SubGitは、SVNリビジョンをすべてのGitコミットに変換し、GitコミットをすべてのSVNリビジョンに変換svn commitしますgit push

さらに必要なのは、コミッターがGitリポジトリを使用できるようにすることです。そのためにgit-http-backendを見てください。次に、作成したGitリポジトリを通常のサブモジュールとして追加できます。SubGitは、Bitbucket Serverのアドオンとしても利用できます。詳細については、こちらをご覧ください。したがって、git-svnなどの外部ツールを使用する必要はありません。

SubGitはプロプライエタリソフトウェアですが、小規模企業(最大10人のコミッター)、学術プロジェクト、オープンソースプロジェクトには無料です。

  1. SmartGit

    SmartGitは、クライアント側でgit-svnを置き換えます。ここで見つけることができるその機能の詳細情報。

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

    SmartGitは独自仕様のソフトウェアですが、非営利目的での使用は無料です。


subgitsubgit.com/documentation/…)との両方が、作業コピーの明示的なファイルによって同じ方法でをsmartgitサポートします。これはあなたがまだチェックアウトの外観にこれらのソフトウェアを使用するために持っていて、基本的な使用することはできません意味のような外部のGitのハブサーバーから直接それらの外観をチェックアウトするユーティリティか。そのため、外部のgitハブサーバー上のに関係するソースは、これらのソフトウェアなしでは監視およびダウンロードできません。これは依然として重要な問題です。svn:externals.gitsvnextmodulesgitgithubgitlabsnv:externals
アンドリー

4

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

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


0

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

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

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


3
ピストンはあなたが最も必要なときにあなたの顔で失敗します;)ので、私はそれをお勧めしません。さらに、ピストンのバグ修正はもうありません。
Henrik、

0

まあ、あるgit-remote-testsvnので、私は何かのようだと思います

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

うまくいくはずです。そうですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.