svn revertするとファイルが消えてしまった
よく分からなくなってもsvn updateとsvn revertやればどんな状態からでも復帰できるだろう、と考えてる私みたいな人だとはまってしまうと思いますので、知識として頭の片隅に置いておくと良いかと思います。
Subversion1.6よりtree conflict機能が追加されたそうですが、これとatomic replace機能が競合している気がします。
試したのはTortoiseSVN1.6.12とSilkSVN1.6.13ですが、1.6以降であればどのクライアントでも発生すると思います。
手順
2人のユーザ(A,B)が同じファイルをそれぞれのワーキングコピーで編集している想定です。
- ユーザAが自分のワーキングコピーでファイル”file.txt”を削除します。(svn delete file.txt)
- その後、ユーザAはcommitを行わずに同名ファイルを追加します。(svn add file.txt)
- ユーザAは上記をコミットします。(svn commit file.txt)
- 一方、ユーザBは自分のワーキングコピーでfile.txtを編集します。
- その後、commit前に更新を行おうとします(svn update)
3.でユーザAがcommitを行うと、ファイルの状態はreplace(置換)になります。
5.でユーザBが更新しようとしたファイルはもうリポジトリには存在しないので(リポジトリにあるのは同名の別ファイル)、tree conflict(ツリー競合)になります。
こういう状況で、ユーザBはとりあえずリポジトリの状態と同期させようとsvn revertすると、file.txtがバージョン管理対象外になってしまいます。
この状況になると、TortoiseSVNやEclipseプラグインなど、GUIで操作するクライアントからはfile.txtを救出することができないようです。
復旧策
コマンドラインから実行できる場合は、svn update file.txt とファイル名を明示的に指定してupdateすれば回復します。ファイル名を明示せずsvn updateだけでは駄目です。
コマンドラインでの実行が行えず、ファイル名を直接指定できない場合には親ディレクトリを一旦削除し、その後そのディレクトリをsvn updateしてやれば、file.txtを含めて取得できます。
どういう操作をすればこんなことになるのか(普通わざわざsvn delete,svn addなんてやらないだろ)、と悩んだのですが、もしかするとEclipseなどのIDE上でファイルを削除すると、自動でsvn deleteが発行されるのかもしれません。その後別の場所で作成しておいたファイルを、modifyのつもりでcommitするとreplaceになる、と。このときaddもIDEからは明示的に行わずに済むのでしょう。[追記: こちら方の記述を見ると、やはりIDE上のファイル操作とVCS操作は連動しているようですね。 EclipseでSVNコミットしたら履歴が消えた。 - 戦う葦 ~ウェブリテラシー篇]
少数のファイルを対象にしている際には気付くと思うのですが、svn switchなど大量のファイルを一気に更新する際には見逃す可能性が高く、ハマることもあったので注意です。
後で気づいたのですが、上記の現象はtree conflicts with replaceで議論されていたようで、ITSへは3334:Tree conflict merry-go-round on update/switchで登録されているようです。1年以上前に報告されていてまだ解消されていないということは、根が深いのでしょうかね…?[追記 2011/7/21: 上記レポートに追記されている通り、1.7.0で解消されるようです。]
後で読む用リンク:
- Tree Conflictの説明
- Subversion1.6リリースノート
- Subversion 1.6.0 and Tree Conflicts
- Study of tree conflict handling in selected modern version control systems, with the goal of providing guidelines for Subversion's new working copy library "wc-ng" (pdf)
- Investigation of tree conflict handling in selected version control systems (pdf)
- 似たような症状
検索するとStefan Sperlingという方の名前がよく出てきますが、この方がSubversionのtree conflict検出実装をされた方なんでしょうかね。
« Android Virtual Devices(AVD)を起動するとインターネット接続できなくなる | トップページ | BazaarでExcelファイルをバージョン管理しようとしたがうまくいかなかった »
この記事へのコメントは終了しました。
トラックバック
この記事へのトラックバック一覧です: svn revertするとファイルが消えてしまった:
» Subversion1.7.0でsvn revertの競合問題が解消されていた [雪羽の発火後忘失]
svn revertを特定状況下で実行すると不具合が発生する問題について、以前のエントリ svn revertするとファイルが消えてしまった: 雪羽の発火後忘失 で記載していました。 先日リリースされた1.7.0で同様の手順 ユーザAが自分のワーキングコピーでファイル”file.txt”を削除します。(svn delete file.txt) その後、ユーザAはcommitを行わずに同名ファイルを... [続きを読む]
« Android Virtual Devices(AVD)を起動するとインターネット接続できなくなる | トップページ | BazaarでExcelファイルをバージョン管理しようとしたがうまくいかなかった »
コメント