CVSで、ふみー!

結城浩

2003年5月22日

CVSでバイナリファイルで「はまった」手順。

  • A-1. 新しいファイルfile.datを作ったので、cvs add file.datした。
  • A-2. しまった、file.datはバイナリファイルだったと気が付いた。
  • A-3. あわててcvs add -kb file.datすると、「すでにaddされてるよ」といわれる。
  • A-4. それならと思いcvs admin -kb file.datすると、「addしたばかりのものをadminはできない」といわれる。
  • A-5. しかたがないのでいったんcvs commitする。
  • A-6. まだfile.datは壊れていない。(※これはウソ)
  • A-7. あらためてcvs admin -kb file.datすると、正しく終了する。
  • A-8. ここで再度cvs commitしようとすると「Up-to-dateチェックに失敗」といわれる。ふみい…どないせいちゅうねん(なぜか大阪弁)。
  • A-9. まだfile.datは壊れていない。
  • A-10. しかたがないのでいったんcvs updateする。
  • A-11. ところがこれで、バイナリファイルではないfile.datによって上書きされてしまうので、file.datが壊れてしまう。
  • A-12. ふみー!

私が行った対処手順(A-9までは同じ)。

  • B-10. まずはいったん、copy file.dat backup.datとして現在のファイルを保持しておく。
  • B-11. ここでいったんcvs updateする。
  • B-12. ところがこれで、バイナリファイルではないfile.datによって上書きされてしまうので、file.datが壊れてしまう。
  • B-13. さっき保持しておいたファイルで再度上書きcopy backup.dat file.datする。
  • B-14. ここでcvs commitする。
  • B-15. cvs status file.datを見ると、ちゃんと-kbがついている。

でも、これってどうにも不手際ですよねえ。 上のシーケンスのうち、A-5が悪いのかなあ。 A-5の代わりにエレガントな対処法はあるんでしょうか。

【マニュアル読まんかおれカネゴン】という声が聞こえたので、CVSのヘルプファイルを読んでみる。 おお、ちゃんと書いてあるではないですか。-Aを使うのか…。

  • C-1. 新しいファイルfile.datを作ったので、cvs add file.datした。
  • C-2. しまった、file.datはバイナリファイルだったと気が付いた。
  • C-3. あわててcvs add -kb file.datすると、「すでにaddされてるよ」といわれる。
  • C-4. それならと思いcvs admin -kb file.datすると、「addしたばかりのものをadminはできない」といわれる。
  • C-5. しかたがないのでいったんcvs commitする。
  • C-6. まだfile.datは壊れていない——というのはうそでした。キーワードの展開が行われるので、ここで壊れている可能性がある。
  • C-7. あらためてcvs admin -kb file.datすると、正しく終了する。
  • C-8. ここで、cvs update -A file.datのように、オプション-Aを使ってupdateすると、無事に復元できる模様。

あ、そういえば、拡張子.datを最初からバイナリファイルだよ、と指定する対処もあったはず。 cvswrappersをいじるのか。ええと…。

後日談

読者の方から、 「addした直後なら、CVS/Entriesを直接編集すればOK」というアドバイスをいただきました。 なるほど! ありがとうございます。