28

私の同僚の 1 人が、メインの CVS リポジトリのディレクトリの内容を完全にめちゃくちゃにしてしまいました。モジュール全体を昨年末の状態に戻す必要があります。これを行うための CVS コマンドは何ですか?

彼は何百ものファイルを追加および削除したため、単純な「古いチェックアウトからファイルをコピーしてコミットする」だけでは十分ではありません。

私はRTFMとSTFWを持っていて、これを試しました:

cvs co modulename  # Note no -P option
cvs up -jHEAD -jMAIN:2008-12-30 modulename

しかし、それはうまくいきません。彼が作成した新しいファイルは削除されますが、古いファイルとディレクトリは復活しません。(私はそれをコミットしませんでした)。

おそらくこれ用のシェル スクリプトを作成できますが、この機能は既に CVS に組み込まれているに違いありません。

更新: いくつかの説明:

  • 特定の日付にモジュールのローカル チェックアウトを取得できます。問題は、それを CVS に戻す方法です。

  • バックアップはありますが、CVS のようなリビジョン管理システムを使用するポイントは、履歴状態を簡単に取得できるはずだということです。次回このようなことが起こった場合、幸運にもバックアップを取得できない可能性があります (たとえば、バックアップは毎日行われるため、最大で 1 日分の作業が失われる可能性があります)。

  • CVS が古いことはわかっています。新しいものに移行する必要があります。しかし、多数の CVS ベースのツール (チェックアウト & ビルド スクリプト、ナイトリー ビルド サーバーなど) を持つ大規模なチームでは、このような移動にかかる時間コストは相当なものです。(評価、スクリプトの更新、テスト、移行、トレーニング、開発者の時間の損失、古いブランチには CVS がまだ必要であるため、両方のシステムを並行して維持すること)。したがって、これは管理者が計画およびスケジュールする必要があります。

更新 #2: これについて報奨金を開始します。 報奨金の資格を得るには、ハッキーなシェル スクリプトではなく、通常の CVS コマンドを使用して元に戻す方法を説明する必要があります。

更新 #3: サーバーはCVS 1.12.13です。アクセスは pserver 経由です。Linux PC で同じバージョンの CVS を使用することも、 Windows でCVSNT 2.0.51dクライアントを使用することもできます。

4

10 に答える 10

27

実際、あなたの最初のアプローチは解決策に非常に近かった. 問題は、日付ベースに参加すると、削除されたファイルとディレクトリが正しく処理されないことです。最初に参加したいコードベースにタグを設定する必要があります:

mkdir code_base1 && cd code_base1
cvs co -D "2008-12-30" modulename
cvs tag code_base_2008_12_30

次に、現在から 2008 年 12 月 30 日までのすべての変更を差し引いて、タグベースの結合を行います。

cd .. && mkdir code_base2 && cd code_base2
cvs co modulename
cvs update -d -j HEAD -j code_base_2008_12_30  # use -d to resurrect deleted directories

code_base1 と code_base2 の内容を比較します。それらは、CVS メタ情報を除いて同一である必要があります。最後に、2008 年 12 月 30 日のコードを新しい HEAD としてコミットします。

cvs commit -m "Revert all changes this year"

-D を使用すると、rtag は削除されたファイルとディレクトリも正しく処理しないため、参加したいコードにこのようにタグ付けしても機能しないことに注意してください。

cvs rtag -D "2008-12-30" code_base_2008_12_30 modulename
于 2009-06-25T04:05:47.177 に答える
2

2 番目のコマンドも、更新ではなくチェックアウトにする必要があると思います。CVS の世界には論理がないので、これを論理で正当化することはできませんが、私にとってはうまくいきました。これを試して:

cvs co -P modulename
cvs co -P -jHEAD -jMAIN:2008-12-30 modulename

HEAD 以外のブランチ (X など) を元に戻す場合は、両方のコマンドで -rX 引数を渡します。

cvs co -P -rX modulename
cvs co -P -rX -jHEAD -jMAIN:2008-12-30 modulename
于 2009-01-14T18:34:58.557 に答える
1

あなたはcvspsを調べることができます。グーグルそれ。

また、キルト(またはキルトが最初に始まったものであるAndrew Mortonのパッチスクリプト)とcvspsを使用すると、チェンジセットの非常に近い近似値を得ることができます。

http://geocities.com/smcameron/cvs_changesets.htmlを参照してください

于 2009-06-28T02:18:09.743 に答える
1

もっと簡単な方法があれば知りたいです。(きっともっと簡単な方法があるはずです)。私がやったことは、Linux PCでbashを使用することでした:

# Get woking copy we're going to change
cd ~/work
rm -rf modulename
cvs up -dP modulename
cd modulename

# Remove all files
find . -name CVS -prune -o -type f -print | xargs cvs rm -f

# Get the old revision
cd ~
mkdir scratch
cd scratch
cvs -q co -D 2008-12-31 modulename
cd modulename

# Copy everything to the working dir and do "cvs add" on it
find . -name CVS -prune -o -type f -print | \
    xargs tar c | \
    (cd ~/work/modulename && tar xv | \
    xargs cvs add)

# Check everything is OK before we commit
cd ~/work/modulename
cvs -nq up

# it gave me an error on readme.txt because I'd deleted and then added it, so:
mv readme.txt x # save good rev
cvs add readme.txt # resurrect the bad rev
mv x readme.txt # clobber file with good rev

# Commit it
cvs commit -m "Revert all changes this year"

# Delete now-empty directories
cvs -q up -dP

# Double-check everything is back how it was
diff -ur -xCVS ~/scratch/modulename ~/work/modulename

その後、まだ違いがあることがわかりました。同僚がスペースを含むファイル名を追加していましたが、上記のプロセスでは削除されませんでした。それらを個別に削除する必要がありました。(find ... -print0ではなく, を使用し、引数を に-print渡す必要がありました。スペースを含むファイルがあることに気づきませんでした。)-0xargs

于 2009-01-12T13:59:15.417 に答える
0

http://www.astro.ku.dk/~aake/MHD/docs/CVS.htmlによると、次のものが必要です。

cvs update -D "30 Dec 2008 23:59"
于 2009-01-12T13:29:22.323 に答える
0

あなたまたは同僚が git に慣れている場合はgit cvsimport、CVS リポジトリをミラーリングする git リポジトリを作成するために使用できます。git でコミット/変更セットを元に戻すのは簡単です ( を使用git revert)。git cvsexportcommit次に、復帰コミットを CVS に送信するために使用できます。

これはすべて非常に複雑に聞こえるかもしれませんが、私の経験では、git cvsimportすべてのgit cvsexportcommit設定が完了すると非常にうまく機能します。プロジェクトでまだ CVS を使用している場合でも、個人的には git のすべての機能を使用できます。

于 2011-08-19T17:34:50.450 に答える
0

オプションを使ってみました-dか?(サブディレクトリの構築)

私が覚えている限り、それは に対して暗示されていますが、 に対しては暗示されてcvs coいませんcvs up

于 2009-01-12T13:15:15.783 に答える
0

大きな問題です。完全な答えはありません。ファイル名のスペースを処理するためのスクリプトに関するヒントです。

それ以外の

find ... | xargs tar c - | ...

入れてみる

find ... | perl -e '@names = <>;' -e 'chomp @names;' -e 'system( "tar", "c", "-", @names);' | ...

そうすれば、アーカイブの作成 (または同様の操作) で名前にスペースが含まれることがなくなり、tar が呼び出される前にシェルの argv 解析がスキップされます。

もう1つ、実際に機能する可能性があります。CVSからSVNへのユーティリティがある場合は、それを使用します(そのようなユーティリティは、「CVS attic」から削除されたファイルをプルすると想定しています。プロジェクト レベルのチェックポイントとして (CVS とは異なり、SVN がそれを行うため)、SVN を使用して適切な時点をフェッチします。たくさんのif...

于 2009-01-14T01:56:34.047 に答える