web-dev-qa-db-ja.com

CVSで以前のコミットに戻す方法

レガシーの理由から、私はプロジェクトでCVSを使用しています。最近、コードを壊したいくつかの変更をコミットし、それらを元に戻す必要がありました。 git revert -r <old_revision>のCVSの類似物は何ですか?

大きな変更を元に戻す方法 のような過去の質問を見ると、CVSコミットは変更されたファイルをグループ化しません。日付を使用して元に戻す唯一の方法はありますか?

また、過去の変更を表示する最良の方法は何ですか? CVSログは多くの情報を出力しますが、そのほとんどは不要です。コミットメッセージと変更されたファイルを確認したい。

31
Fiona T

CVSのドキュメントは here にありますが、これから site は単一のファイルを元に戻す方法を示しています:

古いバージョンを現在のバージョンにする

「oldfile」のバージョンを別のものに保存し、「現在の」バージョンをチェックアウトします。
注:現在のバージョンを取得するには、まだ-Aを実行する必要があります。
"oldfile"タグはまだファイル "oldfile"に関連付けられており、> update -Aが完了するまで削除されません。

次に、「古い」バージョンの名前を「現在の」バージョンに変更します。
%mv oldfile oldfile.old.ver
%cvs update -A oldfile
%mv oldfile.old.ver oldfile
%cvs commit -m "バージョン1.5に戻す"古いファイル

これで、通常どおりファイルのチェックアウト、編集、コミットを続行できます。

これは多くのファイルを再帰的に処理しませんが、うまくいけば助けになります。

18
Dave M

単一のファイルのリビジョンをバックアウトするには、cvs admin -oを使用します。

詳細については、CVSのドキュメント(Unixのようなシステムを使用している場合はinfo cvs)を参照するか、 このリンク を参照してください。

マニュアルから引用:

`-oRANGE'
     Deletes ("outdates") the revisions given by RANGE.

     Note that this command can be quite dangerous unless you know
     _exactly_ what you are doing (for example see the warnings below
     about how the REV1:REV2 syntax is confusing).

     If you are short on disc this option might help you.  But think
     twice before using it--there is no way short of restoring the
     latest backup to undo this command!  If you delete different
     revisions than you planned, either due to carelessness or (heaven
     forbid) a CVS bug, there is no opportunity to correct the error
     before the revisions are deleted.  It probably would be a good
     idea to experiment on a copy of the repository first.

次に、削除するリビジョンまたはリビジョンの範囲を指定するいくつかの方法を提供します。

それが言うように、これは非常に危険です。リポジトリから情報を消去します。これは通常、リビジョン管理システムが防止しようとするものです。

このように履歴を変更する必要がない場合は、Dave Mの答えが示唆するように、古いバージョンのコピーを取得して、悪いリビジョンの上にチェックインするだけです。

そして、あなたは正しい、CVSの重点は個々のファイルにあります。最近のシステムでは、リポジトリ全体の状態を強調する傾向があります。

これまでのところ、これらはすべて一度に1つのファイルしか処理できません。

ただし、指定された日付のモジュール全体を別のディレクトリ(cvs checkout -D date)にチェックアウトし、現在のモジュールのコピーにファイルをコピーして、すべてをチェックインできます。これを行う場合は、必ず「cvs diff」を実行して、変更内容を正確に把握します。

より簡潔なログ情報を取得する良い方法がわかりません。 cvs log引数なしの場合、各ファイルのログが時系列ではなく表示されます。 cvs log filenameは、指定されたファイルのログを提供しますが、同時に変更された可能性のある他のファイルには関連付けません。個人的には、cvs logによって印刷された情報を収集して表示用に再配置するPerlスクリプトを書くことを検討するかもしれませんが、それはおそらくあなたが興味を持っているよりも多くの作業です。

CVSリポジトリをより新しいものにインポートするツールがあります。

10
Keith Thompson

ここにコマンドがあります。

1)誤ったコミットが発生する

2)最新バージョンを確認します。

cvs log file.txt

誤ったコミットが原因で1.25が最新バージョンであるとしましょう。そのため、古いバージョン1.24に戻したいと考えています。

3)だから、次のように進んでみましょう。

cvs update -r 1.24 file.txt // checkout older version
cp file.txt old.txt // create backup
cvs update -A file.txt // again move to latest one
cp old.txt file.txt // replace old to at latest one.
cvs status file.txt // It will shows as locally modified.
cvs commit -m "Reverting false commit"  file.txt
cvs log file.txt // new 1.26 will be created.

4)1.26と1.24が同じであることをdiffで確認できるようにします。

cvs diff -r 1.26 -r 1.24 file.txt 

上記の手順がすべて正しい場合、diffは違いを示しません。

5
Jeegar Patel

2つの-jオプションを使用すると、CVSはそれぞれの2つのリビジョン間の変更をマージします。

例:

ファイル@file {foo.c}がリビジョン1.6に基づいており、1.3から1.5の間に加えられた変更を削除する場合は、次のようにします。

$ cvs update -j1.5 -j1.3 foo.c   # note the order...
2
Vijay Shetty

日付で戻すだけでなく、戻すファイルのセットにタグが付けられている場合は、タグで戻すことができます。

私は同じような状況だと思うものを持っていて、ファイルごとではなくフォルダ全体に影響を与える次のことをしました:

  • cvsは、「古いバージョン」をタグで(または日付で実行できます)新しいフォルダーにエクスポートします
  • 「現在のバージョン」がチェックアウトされ、更新され、ライブであることを確認します
  • 古いバージョンのファイルを現在のバージョンのフォルダーにコピーします
  • 適切なコメントで結果をコミットする

古いバージョンと現在のバージョンの間にファイルが追加/削除された場合、このアプローチを変更する必要があります。

CVS履歴に復帰が表示されます。

1
sparklewhiskers