2

めちゃくちゃになった Subversion リポジトリがあります。それを修正するためにできる賢い何かがあるかどうか疑問に思っています。

基本的に、これはSubversionログによると何が起こったのかです:

  1. ...古い歴史
  2. トランクを削除
  3. トランクを作成
  4. すべてのファイルをトランクに再度追加します (適切な測定のために新しい変更/移動/追加/削除を行います)
  5. その他の変更/移動/追加/削除
  6. さらに...

これは、ポイント 1 と 4 の間のすべての履歴が失われたことを意味します。ここでできることはありますか? それとも、みんなの正気を保つために、無視して先に進むのが最善ですか?

4

3 に答える 3

0

You can always recover the old trunk from before the delete an merge the changes from the new trunk on that branch and then make that the nwe trunk

于 2013-05-23T11:23:51.267 に答える
0

これには URL の変更が含まれるため、実際にはマージを使用できません。あなたがする必要があるのは、古いトランクの場所を見つけることです。これはそれほど難しいことではありません。古いトランクが削除されたときの Subversion リビジョン番号が表示されます。にありsvn logます。その前の改訂はあなたが望むものです。リビジョン 12345 が古いトランクが削除されたときだとしましょう。リビジョン 12344 の復元に関心があります。

新しいトランクを邪魔にならないように移動しましょう。

$ svn mv -m"Getting the 'new trunk' out of the way" $REPO_URL/trunk $REPO_URL/funky_trunk

これにより、新しいトランクが邪魔にならなくなりますが、何かが必要な場合に備えて簡単にアクセスできます。

それでは、古いトランクを復元しましょう。

$ svn cp -m"Restore the original trunk" -r12344 $REPO_URL/trunk@12344 $REPO_URL/trunk

トランクはリビジョン 12345 で削除されたので、リビジョン 12344 からコピーしています。リビジョン 12344-r12344でのファイルの見方@12344です。リビジョン 12344 のリポジトリの構造です。

これにより、トランクがリストのステップ 1 に戻ります。古いトランクが削除されなかったかのようです。

ここで、手順 5、6 などの変更を行う必要があります。マージ ツールを使用できる場合もあります--ignore-ancestry、フラグを使用する場合のみです。これは、古いトランク ファイル$REPO_URL/trunk/dir/foo.txtと新しいトランク ファイル$REPO_URL/trunk/dir/foo.txtは人間の目には同じファイルに見えますが、Subversion はそれらを 2 つの異なるファイルとして認識します。これらは完全に異なる履歴を持っているからです。これは、ClearCase で悪魔の双子の問題と呼ばれるものです。これは、ディレクトリをバージョン管理するときにも得られます。


本当の問題は、なぜこれが行われたのか、なぜ加害者が発砲され、高速で移動するバスの下に投げ込まれ、象に踏みにじられ、その後解雇されなかったのかということです。

あなたのサイトは初期のトランク方式を使用している疑いがあります。これは、トランクが最後にリリースされたもののように見えると想定されるため、トランクがまったく作業されない場所です。それがタグの目的です。

これは、誰かが最後のリリースをトランクに置くと想定されているために発生します。また、定期的に実行されない非常に複雑な分岐戦略がある場合、トランクへのマージは厄介なプロセスになる可能性があります。たとえば、分岐し、トランクにマージし、トランクから再分岐するとしますが、ほとんどの場合、人々はブランチから分岐します。ブランチのブランチのブランチが数回ありますが、それをトランクにマージすることはできません。

それで、その人は何をしますか?トランクを削除し、ブランチをトランクにコピーします! ねえ、最後のリリースはトランクにあり、ほんの数秒しかかからず、数時間もマージと比較も必要ありませんでした。

これは、Subversion のマージに対するあなたの不信感からもわかります。Subversion のマージは、直接関連する 2 つのブランチをマージし、面倒なリファクタリングを行わない場合にうまく機能します。(リファクタリングの問題は、Subversion 1.9 で解決される可能性があります。Subversion は移動と名前の変更を、コピーと削除ではなく、実際の移動と名前の変更として追跡します)。

Subversion のマージでは、2 つの無関係なブランチ、または遠い関係にあるブランチをマージしようとすると問題が発生します。これは、トランクを最終リリースのみに使用しようとしている場合に発生します。タグを使用してリリースをマークします。

Subversion で分岐を処理する方法はいくつかあります。不安定なトランクは、継続的な統合に深く関与しているサイトで使用されます。

アジャイル サイトは、各ユーザー ストーリー、欠陥、またはタスクを独自のブランチに作成することを好みますが、これらのブランチを早期にマージし、多くの場合、統合ブランチに戻す必要があります。

トランクにリリースのみを含める必要があると主張する場合は、統合ブランチを作成し、それを主な作業に使用してください。トランクから統合ブランチを分岐し、完了したら統合ブランチのみをトランクにマージします。他のすべての分岐は、統合分岐からのものでなければなりません。

于 2013-05-23T22:31:33.917 に答える