svn:トランクをブランチに置き換えます


155

Subversionリポジトリのブランチの1つを新しいトランクにする最良の方法は何ですか?

システム全体が大幅に書き直されました。移動、書き換え、置換、削除、名前変更などが行われました。書き換えられたコードはテスト済みで、古いトランクを置き換える準備ができています。

基本的に、古いメインライン(トランク5)にタグが付けられ、ここで終了します。書き直されたブランチ(ブランチ6)は、新しいメインライン(トランク7)になります。

トランク(1)->トランク(2)->トランク(5)->×+->新しいトランク(7)
  \ \ |
  フォークマージ???
    \ \ |
     +-> Branch(3)-> Branch(4)-> Branch(6)-+

古い「トランク」からの継続的な変更はすべて「書き換えられたブランチ」にすでに組み込まれています

これどうやってするの?

回答:


118

svn moveを使用して、古いトランクの内容を別の場所に移動し、ブランチの名前を後からトランクに変更します。

svnでのコピーと移動は、ファイル操作のように機能することに注意してください。それらを使用して、リポジトリ内の移動やコピーを行うことができ、これらの変更もバージョン管理されます。「移動」は「コピー+削除」と考えてください。

[編集]を使用するとマージの競合が発生することがNilbusから通知されましたsvn move

私は今でもこれが正しいアプローチだと思います。競合が発生しますが、慎重にマージすると、データが失われない可能性があります。それが気になる場合は、MercurialGitなどのより優れたVCSを使用してください。


1
これを行うと、変更をマージする必要がある場合でも、元のトランクの作業用コピーに変更を加えた場合、競合が発生します。これは、ファイルが削除されて再度追加されるためです-それらは個別の履歴を持つ個別のオブジェクトとして扱われます。
エドワードアンダーソン

@nilbus:やってみましたか?IIRC、SVNは、ファイルが削除されて再読み込みされたことを示していますが、内部的には、ファイルが移動されたことがわかります。
Aaron Digulla

はい。私は2つのコピーをチェックアウトしました。最初のコピーで、dir AをA2に、dir BをAに移動しました。次に、AをBに移動し、次にA2をAに移動しました(名前を変更して名前を元に戻します)。2回目のチェックアウトで、ファイルに変更を加えてsvn更新。変更したファイルが「削除された」ため競合しました。内部的には、ファイルの重複コピーは保存されませんが、競合が発生した場合に表示される削除は実際に影響します。
エドワードアンダーソン

12
@nilbus:この時点で、Linus Torvaldsを引用したいと思います。「Subversionのスローガンは、「CVSが正しく行われた」、またはそのようなものでした。そのようなスローガンから始めると、どこにもあなたができることはありません。 go。CVSを正しく行う方法はありません。」
Aaron Digulla

3
うん。同意します。この問題を解決するために、実際にはsvn-gitでリポジトリをチェックアウトし、gitを使用してブランチをマスターにリベースしました。
エドワードアンダーソン

66

この目標を達成するためにsvn moveコマンドを使用することに同意します。

私はここの他の人がそれを珍しいと思うのを知っています、しかし私はこのようにそれをするのが好きです。機能ブランチがあり、それを大幅に変更されたトランクとマージする準備ができたら、それを通常はという名前の新しいブランチにマージし<FeatureBranchName>-Mergedます。次に、競合を解決し、マージされたコードをテストします。それが完了したら、トランクをタグフォルダーに移動して、何も失わないようにします。最後に<FeatureBranchName>-Mergedトランクに移動します。

さらに、私は移動を行うときに作業コピーを避けたいと思います。ここにコマンドのサンプルがあります:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

注:1.5を使用します


1
これはベストプラクティスではないかもしれませんが、非常に古いトランクがあり、誰もがそれがトランクであるかのようにブランチで作業した場合、確かに最も効率的です。それは私の問題を解決しました!
Alex Perrin 2017

12

最近この問題を見ていましたが、非常に満足した解決策は

svn merge --ignore-ancestry trunk-url branch-url

私のトランクの作業コピーに。

これは、歴史的な方法で変更を適用しようとはしません(トランクの変更を維持します)。トランクとブランチの間に「差分を適用」するだけです。これにより、変更されていないファイルでユーザーの競合が発生することはありません。ただし、ブランチから履歴情報が失われますが、それでもマージを実行すると発生します。


1
SVN 1.5以降では、履歴を保持するマージを実行できるはずです。
NSherwin 2012年

9

これらの変更は、リポジトリブラウザツールを使用して行うことをお勧めします。

作業コピーを介して大規模な削除と移動の操作を試みることは、作業コピーを強制終了するための優れた方法です。作業コピーを使用する必要がある場合は、削除または移動操作のたびに増分コミットを実行し、コミットごとに作業コピーを更新します。


Repoへのリンクは便利です(便宜上、Google検索を保存します:))
Brian M. Hunt

3
ごめんなさい。スペルが、特定のツール(編集済み)を参照しているように見せました。実際、ほとんどのSVN GUIツールにはリポジトリブラウザー機能が必要です。参考:私はtortoise tortoisesvn.tigris.org
Chris Nava

4

ブランチを新しいトランクにしたい場合(つまり)ブランチの作成以降に行われたトランク内のすべての変更を削除するには、次のようにします。1.トランクのブランチを作成します(バックアップ用)2.「変更を元に戻します"トランク上で(ブランチが作成された後、すべてのリビジョンを選択します。3.ブランチをトランクにマージします。

歴史はこのままであるはずです。

よろしく、ロジャー


3

@Aaron Digullaおよび@kementeusソリューションは実行可能です。Subversion 1.4リポジトリの場合、コピー/移動操作により、別のリポジトリ構造への将来の移行やリポジトリの分割が困難になる可能性があります。

1.5の改善には、移動/コピー履歴のより良い解決が含まれていると思います。そのため、1.5リポジトリでは問題にならないでしょう。

1.4リポジトリの場合は、を使用svnadmin dumpsvndumpfilterて既存のトランクを別の場所に移動してから、同じメカニズムでブランチをトランクに移動することをお勧めします。2つのダンプファイルをテストリポジトリにロードし、確認して、本番環境に移動します。

もちろん、開始する前に既存のリポジトリをバックアップしてください。

これにより、移動/コピーを明示的に記録せずに履歴が保持され、将来の再編成、履歴の保持が容易になります。


編集:要求どおり、1.4 Red-BeanブックのFiltering Repository Historyからの1.4動作のドキュメント

また、コピーされたパスは問題を引き起こす可能性があります。Subversionは、既存のパスをコピーすることによって新しいパスが作成されるリポジトリでのコピー操作をサポートしています。リポジトリの存続期間のある時点で、ファイルまたはディレクトリsvndumpfilterを、除外されている場所から、それが含まれている場所にコピーした可能性があります。ダンプデータを十分なものにするために、svndumpfilterは、新しいパスの追加(コピーによって作成されたファイルの内容を含む)を表示する必要があり、フィルターされたダンプデータストリームに存在しないソースからのコピーとしてその追加を表す必要はありません。ただし、Subversionリポジトリのダンプ形式は各リビジョンで変更されたもののみを表示するため、コピー元のコンテンツをすぐに利用できない場合があります。リポジトリにこの種のコピーがあると思われる場合は、含まれている/含まれていないパスのセットを再考する必要があるかもしれません。

これは、を使用した移行/再編成に適用されますsvndumpfilter。少し余分な作業を行うことで、後で多くの余分な作業を節約できる場合がsvndumpfilterあります。将来の移行/再編成で使用できるようにしておくことで、比較的低コストでリスクを軽減できます。


なぜ「svn move」では不十分なのでしょうか。あなたの提案は、大ハンマーでフライをつぶすようなものです。
ロブウィリアムズ、

私はこの1.4の動作に悩まされています-SVNリポジトリにディレクトリまたはブランチ/タグの移動(名前の変更)が含まれている場合、svndumpfilterを使用してリポジトリを再編成/新しい構造に移行すると、履歴が処理されないため失敗する可能性があります上手。文書化されているので、参考文献を詳しく調べます。ご
Ken Gentle

この動作への参照を追加できますか?
Jacco

2

上記の答えは機能しますが、ベストプラクティスではありません。最新のSVNサーバーとクライアントトラックがマージされます。そのため、svnはブランチにマージしたリビジョンとその場所を知っています。これは、ブランチを最新の状態に保ち、その後トランクにマージするときに非常に役立ちます。

ただし、使用しているSubversionのバージョンに関係なく、ブランチの変更をトランクに戻すためのベストプラクティスの方法があります。これについては、Subversionマニュアルの「Subversionによるバージョン管理」の第4章「ブランチとマージ、ブランチの同期を保つ」で概説されています。


公式情報のThxを使用して、公式のアプローチでブランチをトランクにマージできます。キーワードは再統合です
Junyo

-3

これはSVNでの非常に奇妙な/異常な構成ですが、「良い習慣」には程遠いと思いますが、とにかく、次のようなことができると思います。

  • すべてのソースツリーをチェックアウトします(svn co therootsourcetree)
  • トランクを削除する(svn rm trunk)
  • ブランチをトランクにコピーします(svn cpbranchs / thebranch / trunk)
  • ブランチを削除する(svn rmブランチ/ thebranch)
  • 変更をコミットする

幸運を


9
これは、「svn move」によって保持されるであろう履歴の軌跡を破壊します。
ロブウィリアムズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.