3

git-svn を使用して作成された git リポジトリで、それぞれがリモートとしてマップされているブランチ用の複数のディレクトリを持つ単一の Subversion サーバーを持つことは可能ですか?

既存のセットアップ

  • トランク:http://svn.example.com/trunk
  • 私の枝:http://svn.example.com/developers/luisgo/branches
  • 私のタグ:http://svn.example.com/developers/luisgo/tags
  • 私のスクラムチームのブランチ:http://svn.example.com/teams/scrum-01/branches
  • 私のスクラムチームのタグ:http://svn.example.com/teams/scrum-01/tags
  • 会社の支店:http://svn.example.com/branches
  • 会社のタグ:http://svn.example.com/releases

これはレガシーであり、git に移行中ですが、git-svn を使用できることを証明しようとしています。

  • サーバー上の私の個人用サブバージョン ディレクトリへの 1 つの「個人用」リモート ポイント
  • サーバー上のスクラムチームのサブバージョンディレクトリへの1つの「スクラム」リモートポイントと
  • サーバー上の会社のサブバージョン ディレクトリへの 1 つの「会社」リモート ポイント

リモコンの名前がそれぞれpersonal/branches, personal/tags, scrum/branches, でscrum/tagsある必要がある場合でも、気にしないことに注意してください。company/branchescompany/tags

personal/branches/some-feature-branch最終的には、ローカルであるだけでなく、プッシュされ、後で別のリモートにプッシュできるトランク(別名会社/マスター)のブランチを作成できるようにしたいと考えています(scrum/branches/some-feature-branchコラボレーションのために、最終的にcompany/some-feature-branchリリースのためにプッシュすることに注意してください。タグ付けを理解していますが、この議論の目的のために意図的に省略しています。

私はこれがうまくいくと思った:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
    warnambiguousrefs = false
[svn-remote "svn"]
    url = https://svn.example.com
    fetch = trunk:refs/remotes/trunk
    branches = developers/luisgo/branches/*:refs/remotes/svn/personal/branches/*
    tags = developers/luisgo/tags/*:refs/remotes/svn/personal/tags/*
    branches = teams/scrum-01/branches/*:refs/remotes/svn/scrum/branches/*
    tags = teams/scrum-01/tags/*:refs/remotes/svn/scrum/tags/*
    branches = branches/*:refs/remotes/svn/company/branches/*
    tags = releases/*:refs/remotes/svn/company/tags/*

しかし、そうではありません。

編集 ==========================================

私は自分自身を間違って説明したと思います。技術的には、上記の例は機能します。私が達成しようとしているのは、分岐ディレクトリごとに1つの「リモート」作成を行うことです。

git push personal feature-branch

結果:

https://svn.example.com/developers/luisgo/branches/feature-branch

と...

git push scrum feature-branch

結果:

https://svn.example.com/teams/scrum-01/branches/feature-branch

と...

git push company feature-branch

結果:

https://svn.example.com/branches/feature-branch

本質的personalに、scrumcompanyは、同じ svn サーバー内の異なる branch/* を持つリモートです。

私がこれをやろうとすると:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
    warnambiguousrefs = false
[svn-remote "company"]
    url = https://svn.example.com
    fetch = trunk:refs/remotes/trunk
    branches = branches/*:refs/remotes/svn/company/branches/*
    tags = releases/*:refs/remotes/svn/company/tags/*
[svn-remote "personal"]
    url = https://svn.example.com
    fetch = trunk:refs/remotes/trunk
    branches = developers/luisgo/branches/*:refs/remotes/svn/personal/branches/*
    tags = developers/luisgo/tags/*:refs/remotes/svn/personal/tags/*
[svn-remote "scrum"]
    url = https://svn.example.com
    fetch = trunk:refs/remotes/trunk
    branches = teams/scrum-01/branches/*:refs/remotes/svn/scrum/branches/*
    tags = teams/scrum-01/tags/*:refs/remotes/svn/scrum/tags/*

複数のリモートに同じ URL が指定されているあいまいな設定を解決する必要があることがわかります。そうだと思いますが、これらは 1 つのトランクを共有しています。

編集終了 ==========================================

何か案は?これは可能ですか?

ありがとうございました、

ルイス

PS: これが適切な場所に投稿されていない場合は、お詫び申し上げます。喜んで動かします。炎上する必要はありません。

4

1 に答える 1

1

svn-remote.{name}.urlGitは、同じベースURL(設定)を持つ複数のSubversionリポジトリを持っていることに非常に満足しています。問題は、Gitの観点から、複数の「リポジトリ」をプルしようとしていることrefs/remotes/trunkです。一方からプルすると、もう一方が上書きされます。Gitがそれを確実にする本当の方法がないので、一日の終わりにそれらが同一になるという事実は無関係です。

(Gitの観点からは、これらは完全に別個のリポジトリであるため、引き続き別個の「リポジトリ」を参照します。これらが実際に同じSubversionリポジトリであるという事実は、Gitに違いはありません。)

現在のワークフローに基づいて私が見ることができる2つの可能な解決策があります:

  • 構成からすべての行を削除しfetch = trunk:refs/remotes/trunkて、トランクにプルしようとしているリポジトリが1つだけになるようにします。

    物事を非常にクリーンに保ちたい場合は、トランク専用のまったく新しいリポジトリを次のように設定できます。

    [svn-remote "svn"]
            url = http://svn.example.com
            fetch = trunk:refs/remotes/trunk
    

    次に、そのフェッチを他の3つのリポジトリから削除します。

  • たとえば、「会社」のリモートに行があるように、リポジトリごとにトランクを個別にフェッチしますfetch = trunk:refs/remotes/company/trunk

    つまり、リポジトリごとにいくつかのフェッチ操作を繰り返すことになりますが、Gitはトランクについて知っている(したがって、トランクから/トランクにマージする)ので、正しいマージとブランチの履歴を持つ可能性が最も高くなります。すべてのリポジトリ。

    ただし、Gitは異なるリポジトリ間のマージとブランチを追跡することはできません。そのため、たとえば、スクラムブランチから会社のブランチへのマージはそのように検出されません。

とは言うものの、後のコマンド(たとえば、git push scrum feature-branchにプッシュする)は機能しません。たとえば、機能ブランチがチェックアウトされている間は、などのコマンドを使用する必要があります。teams/scrum-01/branches/feature-branchgit svngit svn branch -R scrum feature-branchgit svn dcommit

ただし、個人的には元の構成をお勧めします。これは最も簡単なオプションであり、コミットを複数回フェッチすることはなく、Gitは分岐およびマージ操作を追跡するために可能な限り最高の仕事をすることができます。

元の構成では、など-dの代わりに-Rを指定する必要があります。これはもう少し複雑ですが、ブランチが作成されると、ブランチへのプッシュはまったく同じになります。追加された構成の単純さ、および完全なマージとブランチの履歴を追跡するGitの機能は、Subversionサーバーでブランチを作成する際の複雑さの増大を補う以上のものです。git svn branchgit svn branch -d teams/scrum-01/branches feature-branchgit svn dcommit

于 2013-03-20T14:02:21.933 に答える