私は友人と一緒にプロジェクトに取り組んでいて、私たちのコードの古いバージョンに戻ってそれを現在のものに設定したいと思います。どうすればいいのですか?
私はvs08で "anksvn"を使っています。
私は自分のPCに必要なバージョンを持っていますが、コミットは失敗しています。 「コミットに失敗しました。ファイルまたはディレクトリが古くなっています」というメッセージが表示されます。
私のPCにはSubversionクライアントもあります。
基本的には "後方へのマージ" - 現在のバージョンと以前のバージョンの差分を適用する to 現在のバージョン(つまり古いバージョンのような作業コピーになってしまいます)をしてから再度コミットする必要があります。たとえば、リビジョン150(現在)からリビジョン140に戻るとします。
svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"
Subversion Red Bookには についての良いセクションがあります 。
Subversionの歴史の 先頭 でのみ新しい変更をコミットできます。
あなたがあなたのPCに持っている良いコピーで直接何もすることができない理由は、その.svn
フォルダがそれが過去からのコードであることを知っているので、どんなコミットの前にも更新を必要とします。
必要な古いコピーのリビジョン番号を見つけます。現在のリビジョンを入手してください。
svn info --show-item revision
# or
svn log
または使用する:
svn update -r <earlier_revision_number>
正しいリビジョン番号が見つかるまで、プロジェクトのさまざまな古いバージョンをチェックします。
正しいリビジョン番号を書き留めます(以下の例では123
と仮定します)。
最新のリビジョンに更新します。
svn update
必要なリビジョンと最新バージョンの間のすべての変更を元に戻します。
svn merge -r HEAD:123 .
svn commit "Reverted to revision 123"
(上記のJon Skeetの答えと同じです。)
もしあなたが古いコピーを見つけることができず、あなたが現在あなたのPCにあるファイルをコミットしたいだけなら:
あなたの良いバージョンのコピーを作成してください(ただし.svn
フォルダーは含みません)。
cd ..
rsync -ai --exclude=.svn project/ project-good/
今、あなたが最新版を持っていることを確認してください:
cd project
svn update
# or make a fresh checkout
svn checkout <url>
作業コピーの上にあなたの良いバージョンをコピーしてください。
このコマンドは、作業コピーから正常にコピーされていないファイルをコピーして削除しますが、既存の.svn
フォルダには影響しません。
cd ..
rsync -ai --exclude=.svn --delete project-good/ project/
Rsyncを持っていない場合は、cp -a
を使用できますが、不要なファイルを手動で削除する必要もあります。
あなたは今持っていることをコミットできるはずです。
cd project
svn commit "Reverted to good copy"
この行を使う
svn update -r yourOldRevesion
あなたは現在のリビジョンを知ることができます。
sVN情報
チェックイン全体を元に戻すためにmergeを使用する標準的な方法は、うまくいきます。しかし、時には、あなたがしたいのは単一のファイルを元に戻すことだけです。それを行うための正当な方法はありませんが、ハックがあります。
Svnのexportサブコマンドを使います。
svn export http:// url-to-your-file @ 123 / tmp/filename
(123は、ファイルの正しいバージョンのリビジョン番号です。)次に、その単一ファイルを移動またはコピーして、古いファイルを上書きします。変更したファイルをチェックインすれば完了です。
もう少しオールドスクール
svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch
それからいつもの
svn diff
svn commit
これが最も適していると思います。
たとえば、コミットされたコードにrev 5612から5616までのリビジョンが含まれている場合は、後方にマージします。それは私の最後に動作します。
例えば:
svn merge -r 5616:5612 https://<your_svn_repository>/
それは以前のリビジョンにマージされたコードを含んでいるでしょう、そしてあなたはそれをコミットすることができます。
これは私がやったことと私のために働いたことです。
特定の時間に行った複数のコミットの変更を元に戻して、前のコミットポイントに進みたい.
これはリバースマージを実行し、作業コピーの変更を元に戻します。
コードを確認してコミットするだけです。
元に戻す一番上の階層を右クリック>> >> Revert
またはRevert to Revision
プロジェクトを右クリックし、[置換]> [リビジョンまたはURL]>元に戻す特定のリビジョンを選択します。
それでは、ローカルのアップデートコードバージョンをリポジトリにコミットしてください。これにより、コードベースが特定のリビジョンに戻ります。
以前の回答のほとんどはリバースマージを使用していましたが、通常これが正しい回答です。しかし、そうではない状況が1つあります(それは私にも起こりました)。
ちょっとした変更を加えると、私は誤ってUnixの行末を持つファイルをDOSの行末に変更してコミットしました。これは簡単に元に戻すことができます。行末を変更して再度コミットするか、逆マージすることで、ファイルの各行のソースとしてsvn blame
リストを編集できるようにする効果があります。 (興味深いことに、Windows上のTortoiseSVNはこれによる影響を受けません。コマンドラインsvn blame
のみ)。
あなたがsvn blame
によって報告されたように歴史を維持したいならば、私はあなたが以下をする必要があると思います:
削除は少し怖いですが、ファイルをリポジトリに保存しているので、復元しても大したことはありません。これがステップを説明するためのコードです。 xxx
が最後の正常なコピーのリビジョン番号であると仮定します。
svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"
リポジトリ内のコピーの場合、保存先はファイル名ではなくディレクトリである必要があることに注意してください。
このページには危険な答えがたくさんあります。 SVNバージョン1.6以降、update -rを実行するとツリーの競合が発生する可能性があることに注意してください。これは、ツリーの競合に関する情報を探しているところでデータを失う可能性のあるkafkeresqueの悪夢に急速に拡大します。
バージョンに戻す正しい方法は次のとおりです。
svn merge -r HEAD:12345 .
12345はバージョン番号です。ドットを忘れないでください。
Jon Skeetの答えは、ほとんど一言で言えば解決策ですが、あなたが私のような人であれば、説明が必要かもしれません。 Subversionのマニュアルではこれをaと呼んでいます。
Manページから.
この形式は 'チェリーピック'マージと呼ばれます。 '-r N:M'はリビジョンNとMの間のソースブランチの履歴の違いを表します。
変更を元に戻すには、「逆の範囲」を使用できます。たとえば、sourceとtargetが同じブランチを参照している場合、以前にコミットしたリビジョンは '元に戻す'ことができます。 逆の範囲 で、Nが '-r N:M'のMより大きい、または '-c'オプションが負の数で使用されている。 '-c -M'は '-r Mと同じです。 : '。このような変更を元に戻すことは、「リバースマージ」の実行とも呼ばれます。
ソースがファイルの場合、差分がそのファイルに適用されます(以前の変更を逆マージするのに役立ちます)。それ以外の場合、ソースがディレクトリの場合、ターゲットはデフォルトの '。'になります。
通常の使用法では、作業コピーは単一のリビジョンで、最新の状態になっているはずです。ローカルの変更やサブツリーの切り替えはありません。
例:
svn merge -r 2983:289 path/to/file
これはローカルコピー[2983](上記の引用によれば、サーバと同期しているはずです - あなたの責任です)をサーバからのリビジョン289に置き換えます。変更はローカルで行われます。つまり、清潔なチェックアウトがある場合は、変更をコミットする前に変更を確認できます。
古いバージョンに同期してコミットします。これでうまくいくはずです。
これは また元に戻す変更の説明です。