web-dev-qa-db-ja.com

Git-Svnを使用した非標準のSvnリポジトリのクローン作成

私はGitに比較的慣れていませんが、自宅での作業がとても簡単なので、プロジェクトがSvnリポジトリに保存されている職場で使用したいと思います。残念ながら、リポジトリは少し標準的ではなく、クローンを作成するのに問題があります。確かに、それらはすべてトランク、ブランチ/、タグ/を持っていますが、ブランチ/とタグ/はrealプロジェクトディレクトリに到達する前にサブディレクトリを持っています:

trunk/
branches/maintenance/release1
branches/maintenance/release2
...
branches/development/feature1
branches/development/feature2
...
tags/build/build1
tags/build/build2
...
tags/release/release1
tags/release/release2

クローン作成後:

$ git svn clone -s --prefix=svn/ https://mydomain.com/svnproject
$ git branch -r
  development
  development@1340
  maintenance
  maintenance@1340
  tags/build
  tags/build@1340
  tags/release
  tags/release@1340
  trunk
  trunk@1340 

実際のプロジェクトブランチやタグは取得できません。実際には、トランク、1つのメンテナンスブランチ、1つの開発ブランチで作業できる必要があります。構成を変更する際のいくつかのハックに加えて、このアプローチを試しましたが、何も機能していません。

非標準のSvnプロジェクトの主要コンポーネントをローカルのgitリポジトリに入れて、それらの間を簡単に移動できるようにする方法はありますか?

どうもありがとう。

更新:Gitへの大規模な切り替えは(まだ)できないことを付け加えておきます。他のチームメンバーが関与しており、国際的なプレゼンスがあります。移行のロジスティクスは、私はGitの方がはるかに快適です。前述したように、私はまだかなり新しいです。Gitの機能の表面をほとんど傷つけていません。

37
Rob Wilkerson

リーBは正しかった。 #gitでdoenerによって提供された答えは、Gitを1.6.xにアップグレードすることです(私は1.5.xを使用していました)。 1.6.xはディープクローニングを提供するため、--branchesオプションで複数のワイルドカードを使用できます。

$ git svn clone https://svn.myrepos.com/myproject web-self-serve \ 
          --trunk=trunk --branches=branches/*/* --prefix=svn/
$ git branch -r
  svn/development/sandbox1
  svn/development/feature1
  svn/development/sandbox2
  svn/development/sandbox3
  svn/development/model-associations
  svn/maintenance/version1.0.0
  svn/trunk

まさに私が必要としていたもの。洞察力をありがとう、すべて。

38
Rob Wilkerson

Svnをgitリポジトリにインポートするために nirvdrumのsvn2git (最新のようです)を試してみてください?
(2009年初頭、 Paul これに言及iteman's svn2gitこれの代わりに 元のjcoglanのsvn2git 、これは、彼の作者が述べたように、「Subversionからコードを取り出すための簡単なハック」でした)

Svnにこのコードがある場合、git svn cloneよりも優れています。

  trunk
    ...
  branches
    1.x
    2.x
  tags
    1.0.0
    1.0.1
    1.0.2
    1.1.0
    2.0.0

git-svnは、コミット履歴を調べて、新しいgitリポジトリを構築します。
それはすべてのブランチとタグをリモートsvnブランチとしてインポートしますが、本当に必要なのはgitネイティブのローカルブランチとgitタグオブジェクトです
したがって、このプロジェクトをインポートすると、次のようになります。

  $ git branch
  * master
  $ git branch -a
  * master
    1.x
    2.x
    tags/1.0.0
    tags/1.0.1
    tags/1.0.2
    tags/1.1.0
    tags/2.0.0
    trunk
  $ git tag -l
  [ empty ]

プロジェクトでsvn2gitが完了すると、代わりに次のようになります。

  $ git branch
  * master
    1.x
    2.x
  $ git tag -l
    1.0.0
    1.0.1
    1.0.2
    1.1.0
    2.0.0

もちろん、このソリューションは片道旅行を意味するものではありません。

いつでもsvnリポジトリに戻ることができます...git2svn(また そこに存在 =)

アイデアは残っています:

  • 中央リポジトリとして機能しているSVN。

  • 「他の場所」でGitを実行して、複数のGitプライベートブランチ間ですばやく実験します。

  • import backGitブランチのみを公式のSVNブランチに統合しました。

13
VonC

プレーンワイルドカードで提供されないリポジトリレイアウトの場合:( 私の回答 から この関連する質問

現在のgit-svnマンページ は次のように述べています。

中括弧内の名前のコンマ区切りリストを使用して、ブランチまたはタグのサブセットをフェッチすることもできます。例えば:

[svn-remote "huge-project"]
     url = http://server.org/svn
     fetch = trunk/src:refs/remotes/trunk
     branches = branches/{red,green}/src:refs/remotes/branches/*
     tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
9
joshwa