Subversionのコードを古いバージョンに戻すにはどうすればよいですか?
質問
友人と一緒にプロジェクトに取り組んでいます。古いバージョンのコードに戻り、最新バージョンに設定したいと考えています。どうすればいいですか?
" anksvn"を使用していますvs08で。
PCに必要なバージョンがありますが、コミットが失敗しています。私が受け取るメッセージは "コミットが失敗しました。ファイルまたはディレクトリが古くなっています。"
PCにもSubversionクライアントがあります。
解決
基本的に、「後方にマージ」する必要があります; -現在のバージョンと以前のバージョンの差分を現在のバージョンに適用し( 、古いバージョンのように見える作業コピーを作成します)、再度コミットします。たとえば、リビジョン150(現在)からリビジョン140に戻るには:
svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"
Subversion Red Bookにはこれに関する良いセクション。
他のヒント
Subversion履歴の head でのみ新しい変更をコミットできます。
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情報
マージを使用してチェックイン全体を取り消す標準的な方法は、それがあなたがしたいことであるなら、うまく機能します。ただし、場合によっては、1つのファイルを元に戻すだけです。それを行う正当な方法はありませんが、ハックがあります:
- svnログを使用して目的のバージョンを見つけます。
-
svnのexportサブコマンドを使用:
svn export http:// url-to-your-file @ 123 / tmp /ファイル名
(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>/
以前のリビジョンにマージされたコードが含まれている場合、コミットできます。
これは私がやったことであり、私のために働いたものです。
特定の時間に行った複数のコミットの変更を元に戻し、前のコミットポイントに移動したい。
- チームに移動-&gt;履歴を表示します。
- 無視するリビジョンまたはリビジョン範囲を右クリックします。
- 「変更を元に戻す」を選択しますオプション。
これにより、リバースマージが実行され、作業コピーの変更が取り消されます。
コードを確認してコミットします。
元に戻す最上位の階層を右クリック&gt;&gt; Revert
または Revert to Revision
プロジェクトを右クリック&gt;置換&gt;リビジョンまたはURL&gt;戻す特定のリビジョンを選択します。
ローカル更新コードのバージョンをリポジトリにコミットします。これにより、コードベースが特定のリビジョンに戻ります。
これまでの回答のほとんどは逆マージを使用しており、通常は正しい回答です。ただし、そうではない状況が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"
リポジトリ内のコピーの場合、宛先はファイル名ではなくディレクトリである必要があることに注意してください。
古いバージョンに同期してコミットします。これでうまくいくはずです。
こちら変更の取り消しの説明も。
Jon Skeetの答えは、一言で言えばかなりの解決策ですが、あなたが私のようであれば、説明が必要かもしれません。 Subversionマニュアルではこれを
と呼んでいますチェリーピックマージ
manページから。
このフォームは「チェリーピック」マージと呼ばれます: 「-r N:M」は、 リビジョンNとMの間のソースブランチ。
「逆方向範囲」を使用して、変更を取り消すことができます。たとえば、 ソースとターゲットは同じブランチを参照し、以前にコミットされた リビジョンは「元に戻す」ことができます。 逆の範囲では、NはMよりも大きい '-r N:M'、または '-c'オプションが負の数で使用されています: '-c -M' 「-r M:」と同等です。このような変更を元に戻すことも知られています 「逆マージ」を実行します。
ソースがファイルの場合、差分が適用されます ファイル(以前の変更を逆マージするのに便利です)。さもないと、 ソースがディレクトリの場合、ターゲットはデフォルトで「。」になります。
通常の使用では、作業コピーは最新の状態で、単一の リビジョン、ローカル変更およびサブツリーの切り替えなし。
例:
svn merge -r 2983:289 path/to/file
これにより、ローカルコピー[2983](上記の引用によると、サーバーと同期する必要があります-お客様の責任)がサーバーのリビジョン289に置き換えられます。変更はローカルで発生します。つまり、クリーンなチェックアウトがある場合、変更をコミットする前に検査できます。
このページには多くの危険な答えがあります。 SVNバージョン1.6以降、update -rを実行するとツリーの競合が発生する可能性があることに注意してください。
バージョンに戻す正しい方法は次のとおりです。
svn merge -r HEAD:12345 .
12345はバージョン番号です。ドットを忘れないでください。
次は私のために働いた。
ローカルに多くの変更があり、ローカルコピーの変更を破棄し、SVNの最後の安定バージョンをチェックアウトする必要がありました。
-
無視されたファイルを含むすべてのファイルのステータスを確認します。
-
すべての行をグレップして、新しく追加され無視されたファイルを取得します。
-
これらを
//
に置き換えます。 -
およびrm -rfすべての行。
svn status --no-ignore | grep '^ [?I]' | sed&quot; s / ^ [?I] //&quot; | xargs -I {} rm -rf&quot; {}&quot;