8

ユーザーがWindowsエクスプローラーを使用してファイルをコピーし、svnリポジトリレベルのコピーまたはマージを実行する必要があるときにそれらをコミットする場合があります。したがって、SVNはこれらの変更を適切に追跡していません。私がこれを知ったら、損傷は明らかにすでに行われており、問題のファイルにその後多くの編集が行われた可能性があります。歴史のこの部分も失わないことが重要です。これらの状況が発生したことがわかったときに、リポジトリ内の状況をさかのぼって改善するためにできることはありますか?

具体的には、ターゲットファイルがすでに存在するかどうかに応じて、2つのシナリオがあります。最初のシナリオでは、(1)ユーザーがコピーとして記録されなかった追加を実行しました。2番目のシナリオでは、(2)ユーザーがマージとして記録されない更新を実行しました。

さらに、ソースファイルとターゲットファイルの両方が、コミットされた後続の更新を受けています。場合によっては、これらの後続の編集も手動で行われているため、適切なmergeinfoがありません。

可能性:mergeinfo revpropを過去のリビジョンヘルプに手動で追加できますか?もしそうなら、どうすればこれを行うことができますか?両方のシナリオを考慮してください。

4

3 に答える 3

1

私が考えることができるシナリオとそれらを解決する方法は次のとおりです(可能であれば):

1) ファイルがコピーされ、変更が (元の URL に) コミットされている

1a) ブランチにそれらのファイルがまだない場合:

  • ファイル(またはそれらを含むディレクトリ)をブランチにsvn-copyします(これにより履歴が保持されます)
  • トランク内の特定のファイルに他に変更がない場合は、それらのファイル/エンクロージング ディレクトリのトランクを、コピーの直前のリビジョンに戻します。
  • これらのファイルへのトランクに変更があった場合でも、逆マージを実行することで、ブランチに属する変更を取得できる場合があります。一部の変更が重複していない限り、これは成功するはずです。

1b) ブランチにそれらのファイルが既にある場合:

  • トランクの変更をブランチに svn-merge
  • 1a) と同じトランクの考慮事項

2) ファイルがコピーされ、変更が加えられましたが、コミットされていません (コピーによって変更されていないため、元の URL に)

: 変更はまだコミットされていないため、保持する履歴はなく、トランクとは何の関係もありません

2a) ブランチにそれらのファイルがまだない場合:

  • 正しくコピーされていないファイル/ディレクトリの物理コピーを作成します
  • 問題のあるフォルダーをブランチの作業コピーから削除します
  • 以前にコピーしたファイル/ディレクトリをブランチの作業コピーの適切な場所にコピー/移動します
  • ブランチにファイルを追加する

2b) ブランチにそれらのファイルが既にある場合:

  • 正しくコピーされていないファイル/ディレクトリの物理コピーを作成します
  • 問題のあるフォルダーをブランチの作業コピーから削除します
  • ブランチの作業コピーを更新する
  • 以前にコピーされたファイル/ディレクトリを、ブランチの現在の最新の作業コピー内の対応するファイル/ディレクトリとマージ(*)します。
  • ブランチにファイルを追加する

(*) WinMerge などの通常のマージ ツールを使用します。


更新:編集後、状況がよくわかりました(上記は、手動でコピーした後、コピーされたフォルダーのURLがまだトランクを指しているという前提でした)

svn propset --revprop -r <revision> snv:mergeinfo <updated mergeinfo>マージ情報を「修正」するためにブランチで (pre-revprop-change フックによってブロックされていない限り)を使用してみることができますが、svn はこの情報をその操作の一部 (例: マージ); また、後者のため、更新されたコンテンツには十分注意する必要があります

より良いオプションは、コピーされたファイルが参照するトランクのリビジョンを含めるために、ブランチへの間違ったコミットのリビジョンでログを更新することだと思います。このようにして、必要に応じて情報を利用できますが、svn の将来の操作を台無しにするリスクはありません。このアプローチの大きな欠点は、ブランチをトランクにマージすると、解決しなければならない競合が発生する可能性があることです (マージ情報が更新されていないため)。この操作を行うコマンドは次のとおりです。svn propset --revprop -r <revision> svn:log <updated log message>

于 2012-06-15T17:28:00.407 に答える
0

私の解決策は技術的ではありません。むしろ、あなたはあなたの人々に彼らが何か間違ったことをしていることを教え、彼らにそれを正しくする方法を示さなければならないと思います。怒ることは何もない。時々、人々(私自身を含む)は、より良い方法があることに気付いていないため、または彼らがまだより良い方法を理解していないために、愚かなことをします。

これが本当に繰り返される場合は、間違いと成功に注意してください。ボード上の結果を集計し、それをゲームにします。人を選ばないでください。しばらくすると、問題は解決します。

于 2012-07-17T20:02:39.223 に答える
0

コピーされたファイルが新しい場所に追加されていないと仮定すると、最初に考えたのは次のことです。

  1. 移動された現在の WC ファイルのバックアップを作成します
  2. #1 のファイル のレポ移動(履歴を保持するため) を行います。
  3. svn upトイレを一列に並べる
  4. ファイルが正しくマージされていることを確認し、そうでない場合は #1 のバックアップを使用してファイルを同期させます。
  5. コミットして次に進む
于 2012-06-15T13:59:49.070 に答える