1

SVN にアイデンティティ クライシスがあると思われるフォルダがあります。チェックアウトして分岐することはできますが、マージは失敗します。

svn co http://svn/myrepo
cd myrepo
svn merge .

上記は次のようなものを生成します(省略):

--- Merging r33050 through r36572 into '.':
   C Gemfile.lock
   C test_source/src/...
Skipped missing target: 'test_source/libs'
 G   test_source/src
 G   test_source
Skipped missing target: 'source/Rakefile'
Skipped missing target: 'source/Gemfile'
Skipped missing target: 'source/libs'
Skipped missing target: 'source/Gemfile.lock'
   C source/src/...
 G   source
   C Rakefile
   C Gemfile
 G   .
Summary of conflicts:
  Tree conflicts: 26
  Skipped paths: 5

同様に、このフォルダーから分岐した場合svn cp http://svn/myrepo http://svn/myrepo2、分岐は同様にそれ自体にマージすることも、トランクをそれにマージすることも、その逆もできません。

とはいえ、svn upそれでも問題なく動作します。

この歴史の中で何か悪いことをしたに違いないと感じています。これを修復する方法、またはさらに調査できる場所はありますか? 避けられるのであれば、エクスポート/インポートしたくありません。ありがとう。

4

2 に答える 2

0

あなたが行ったマージ コマンドが意味をなさないということは、すべてのコメンターに同意しますが、詳しく見てみたいと思います。だから私も自分自身を試してみましたが、あなたが説明したような結果を得ることができませんでした.

svn merge .私にとって、チェックアウト直後のコマンドは何もしません - 例外として。今、あなたのケースでマージされたこれらの変更はどこから来たのだろうか. あなたの例には奇妙なことがあります。

これら 3 つの手順 (チェックアウト、cd、マージ) を実際に次々に実行した場合、通常、マージできる変更はありません。では、これらの 2 つのリビジョン r33050 と r36572 はどこから来たのでしょうか? svn mergeは 3 つの場所を使用します。2 つの「ソース」の場所で、その違い (リビジョン) が 3 番目の「ターゲット」の場所にマージされます。この構文では、実際には別のターゲットの明示的な指定を省略できます。ただし、チェックアウトが派生した場所のリポジトリの状態がその間に変更された場合を除いて、ソースとターゲットの間に違いはありません。その場合、引用した出力が期待されますが、チェックアウトとマージの試行の間に 3500 のリビジョンがコミットされた場合は、確かに言ったでしょう

したがって、セットアップには何か異なるものがあるはずです。チェックアウトとマージの間でリポジトリが変更された可能性を本当に排除できますか? たぶん、リポジトリはあなたによって維持されていませんか? すべてのリビジョンをインポートして、一部のバックアップがリロードされた可能性がありますか? それとも場所が移動されたのでしょうか?これらのことは、詳細ではないにしても、少なくとも一般的には出力を説明します。

リポジトリ側に変更を加えることなく、期待どおりの結果が得られます。

$> svn co https://.../[...]
$> cd [...]
$> svn merge . 
$> 

私の結論:これらのうちの1つ:

  • チェックアウトとマージの間でリポジトリが変更されました。
  • あなたのリポジトリは、常に「興味深い」アーティファクトを生成するファイルシステムで NFS などのサポートされていないネットワークを内部的に使用しています。
  • チェックアウトとマージの間で URL が変更されました (おそらくエイリアスまたはリダイレクト?)。
  • あなたが引用した結果につながる何をしたかについてのいくつかの情報を省略しました。
  • おそらくsvnプロパティによって、上記のアクションのいくつかを実行するいくつかのフックがアタッチされています。
  • svn switchコマンドがチェックアウトまたは別の場所で発行されましsvn mergeた。
  • あなたは単にヘッドをチェックアウトしていませんでしたが、過去のある時点で 3500 リビジョンをチェックアウトしました。
于 2012-12-02T11:20:56.843 に答える
0

ここで試してみましたが、うまくいきません。私が理解している限り、コマンドが行うことはおそらく意図したものではありません。

svn help merge言います:

この形式は「同期」(または「キャッチアップ」) マージと呼ばれます。

svn マージ SOURCE[@REV] [TARGET_WCPATH]

同期マージは、親ブランチで行われたすべての最新の変更を取得するために使用されます。つまり、ターゲット ブランチは元々ソース ブランチをコピーすることによって作成されており、ブランチ以降にソース ブランチでコミットされたすべての変更がターゲット ブランチに適用されます。これは、マージ追跡を使用して、すでにマージされているすべてのリビジョンをスキップするため、同期マージを定期的に繰り返して、ソース ブランチを最新の状態に保つことができます。

したがって、このコマンドによって、svn にパス "." のすべての変更を適用するように指示します。(これは「http://svn/myrepo」に変換されると思います) 現在の WC に。もちろん、これは失敗するはずです。

このコマンドでどのような便利なサービスを実行したいかわかりません。最新の変更を「インポート」したい場合は、単純svn upにサーバーからのすべての新しい変更をWCに統合します。

于 2012-11-30T18:20:42.780 に答える