5

git-svn多くのブランチを持つ大規模な Subversion リポジトリを考えると、最初にクローンを作成しtrunk、後で特定のブランチを追加して使用を開始したいと考えています。これを行う方法を少なくとも3つ見ましたが、それらのいずれかが「公式」ですか、それとも最善の方法はありますか?

次のレイアウトを想定します。

https://svn-repo.com/svn/company
   +--core
   |  +--trunk
   |  +--branches
   |  |  +--fastboot
   |  |  +--playground
   |  +-tags
   +--mobile
      +--trunk
      +--branches
      +--tags

したがって、プロジェクトのトランク (ブランチなし) リビジョン 12345 のみを複製するにはcore:

$ git svn clone --username=svnuser -r 12345 -Ttrunk https://svn-repo.com/svn/company/core

coreこれにより、プロジェクトが同じ名前のディレクトリに複製され、実行git svn rebaseするとすべての変更が取り込まれます (リビジョン 12345 以降)。この時点.git/configで、次のようなものが含まれているはずです。

[svn-remote "svn"]
  url = https://svn-repo.com/svn/company
  fetch = core/trunk:refs/remotes/trunk

ここまでは順調ですね。playgroundここで、ブランチを追加したいとしましょう。これは少しぼやけているところです。


オプション 1.git/config :そこにブランチを追加して、既存のリモートを更新します。

[svn-remote "svn"]
  url = https://svn-repo.com/svn/company
  fetch = core/trunk:refs/remotes/trunk
  branches = core/branches/{playground}:refs/remotes/branches/*

この時点で、次のことができました。

  1. ブランチのリビジョン 23456 を取り込みますplayground

    $ git svn fetch -r 23456

  2. ローカルブランチを作成してそこに切り替える

    $ git checkout -b playground branches/playground

  3. 最新の変更を取り込みます。

    $ git svn rebase


オプション 2.git/config : (既存のものに加えて)新しいリモートを追加します。

[svn-remote "playground"]
  url = https://svn-repo.com/svn/company
  fetch = core/branches/playground:refs/remotes/playground

ここからの手順は、オプション 1の手順と似ています。

$ git svn fetch playground -r 23456
$ git checkout -b playground remotes/playground
$ git svn rebase

オプション 3 : 誰かが既存のリモートに新しいフェッチを追加するのも見ました:

[svn-remote "svn"]
  url = https://svn-repo.com/svn/company
  fetch = core/trunk:refs/remotes/trunk
  fetch = core/branches/playground:refs/remotes/branches/playground

それが正しいかどうか、またはそれが機能するかどうかは完全にはわかりません。私はそれを見た場所を見つけることができません。


現在、私はOption 1に固執していますが、これを行うための最も適切な方法を本当に知りたいです。

4

1 に答える 1

4

あなたが注意するすべてのオプションは有効であり、これを行うための「標準的な」方法はありません。これは、(git svnの観点から)Subversionリポジトリをレイアウトする標準的な方法が1つもないためです。

選択したオプション 1 と 3 は、本質的に同等です。個人的には、オプション 3 を使用したかったのですが、結果はオプション 1 と同じになります。

オプション 2 は機能しますが、Git がブランチをまたがるコミット履歴を検出できなくなります。Git は通常、ブランチをマージまたは作成する Subversion コミットを検出しようとし、それらを Git コミットに記録しますが、 2 つのブランチを完全に別のリポジトリとして扱います。

とはいえ、後で新しいブランチを追加するだけでは、すでに多くの履歴が失われています。次のフローを検討してください。

  • Git リポジトリにはgit svn、トランクのフェッチのみが含まれています。
  • 誰かがトランクからプレイグラウンド ブランチを作成し、そのブランチでいくつかのコミットを行い、プレイグラウンドをトランクにマージします。
  • git svnトランクを取得するために使用します。マージが表示されますが、playground ブランチについては何も知らず、通常のコミットとして Git リポジトリに追加されます。

ずっと Playground ブランチを選択していた場合、Git はブランチとマージを検出し、それらをそのように記録します。マージを記録するために古いコミットを書き換えないためgit svn reset、すべてのコミットを再取得するために使用しない限り、後でプレイグラウンド ブランチを追加しても役に立ちません。git svn

Chronial がコメントで示唆したように、私が行ったことは、すべてのブランチをすぐに複製することです。これは遅いプロセスです (私は、約 300 のブランチとタグを持つ 100,000 コミ​​ットの Subversion リポジトリでこれを行いました)、完了するまでに数日かかる場合がありますが、バックグラウンドでそのままにしておくことができます。完全な Subversion 履歴があります。

于 2013-03-14T14:40:23.080 に答える