SVN-完全なローカルコピーをヘッドバージョンに更新します
質問
私のチームの誰かが、チームリポジトリの現在の改訂で複数のファイルを削除するために「間違い」を犯しました。現在のローカルバージョンをヘッドリビジョンに更新することは可能ですか? Commitをクリックすると、SubClipseは欠落しているファイルを認識してアップロードしません。
前もって感謝します、
レイット
解決
ああ、ピートの愛のために!これまでの答えは、せいぜい誤解を招くものでした。
あなたの質問から、それはあなたがこのようなことをしようとしているように聞こえます:
svn update -r8
# ok, I can see the deleted file now
svn commit -m "I want r8 to be newest"
それが機能しないことを除いて。コミットする変更はありません。古いリビジョンに更新することはできますが、そこで変更を加えることはできません。過去を変えることはできません。損害を取り消すだけで、新しい改訂版のみを犯すことができます。
OK、リポジトリがsvn:// repoにあると仮定しましょう。ここでは、フォルダートランクに「A」と「B」という2つのファイルが含まれる単純化された例です。このリビジョン8(R8)と呼びましょう。
trunk # working copy of svn://repo/trunk
a
b
Jrハッカー、滑り落ちて誤って削除するb:
svn rm b
svn commit -m "oops"
結果のコミットR9と呼びましょう。
したがって、次回リポジトリから更新するとき、
svn update
trunk
a
Bが消えます!パニック?いいえ。これはバージョン制御システムです。チェックインされたものはすべて復元できます。ここに2つの可能性があります:
ただ コピー 古いリビジョンからのファイル、すなわち、それがまだ存在していた最後の改訂:8。
svn cp svn://repo/trunk/b@8 .
svn commit -m "restored b from revision 8"
より一般的な解決策は、aを使用することです マージ. 。この手法を使用して、単なる迷惑な削除以上のものを取り消すことができます。
svn merge -r9:8 . .
svn commit -m "reverted the changes made in revision 8"
このマージを読む方法は次のとおりです。
最初に、現在のディレクトリに関連付けられているリポジトリフォルダー(svn:// repo/トランク)のR9(back)からR8に到達するためにどのような変更を行う必要があるかを把握します(最初の "。")。次に、現在のディレクトリ(2番目の "。")の作業コピーでこれらの変更を実行します。
単一の変更を戻すだけで、より便利な構文があります。
svn merge -c-8 . . #note the minus sign before the 8
コマンドラインからSVNを使用していない場合は、ツールの周りを少し突き刺してください。何かを見つけることができます。たとえば、Tortoisevnには、作業コピーからログを開くと、便利な「この改訂からの変化の変化」があります。
他のヒント
削除されたSVNファイルのコピーをどこかにリビジョン(デスクトップの一時フォルダーなど)から削除し、その後(同僚のコミットされた削除アクションに従って、元のファイルが削除されます)を更新し、コピーを元に戻しますそしてそれらをsvnに戻します。
私は次のことをします:
削除の前に改訂番号を見つけます... svnadmin dump -r1:[goodrevisionnumber here]> file.dumpを実行します。
次に、新しいリポジトリ「svnadmin create [repository name]」を作成し、ダンプを新しいリポジトリにロードします。 「svnadmin load [newRepositoryName] <file.dump。
次に、このリビジョンをチェックして、古いチェックアウトから新しいチェックアウトにコピーしてコミットします。