削除、移動、名前変更

Subversion では、ファイルやフォルダーの名前の変更や移動が可能です。そのため TortoiseSVN のサブメニューには、「削除」や「名前を変更」コマンドがあります。

図4.34 バージョン管理下のファイルに対するエクスプローラーのコンテキストメニュー

バージョン管理下のファイルに対するエクスプローラーのコンテキストメニュー


ファイルやフォルダーの削除

Subversionからファイルやフォルダーを削除するには、 TortoiseSVN削除 を実行してください。

TortoiseSVN削除 を実行すると、ファイルやフォルダーは作業コピーからすぐに削除され、次のコミットでリポジトリから削除するようにマークされます。項目の親フォルダーには削除 オーバーレイアイコンを表示します。変更をコミットする前ならば、親フォルダーに対して TortoiseSVN変更の取り消し を実行すると、ファイルを取り戻すことができます。

項目をリポジトリから削除しても、バージョン管理外のファイルやフォルダーとして残しておきたい場合は、 拡張コンテキストメニュー削除(作業コピーは保持) を使用してください。エクスプローラーのリストウインドウ(右画面)で Shift キーを押したまま項目を右クリックすると、拡張コンテキストメニューが表示されます。

TortoiseSVN のコンテキストメニューを使用せずに、項目をエクスプローラーで削除した場合、コミットの際に、コミットダイアログにはそのファイルが紛失と表示され、バージョン管理からも削除するかどうか確認してきます。しかし、作業コピーに対して更新を実行すれば、 Subversion は紛失したファイルを特定し、リポジトリから最新のファイルを取得して置き換えます。バージョン管理下のファイルを削除する場合は、必ず TortoiseSVN削除 を使用するようにしてください。そうすると Subversion は項目を本当に削除するべきかどうか推測する必要がなくなります。

削除したファイルやフォルダーを取り戻す

ファイルやフォルダーを削除してリポジトリにコミットした後では、 TortoiseSVN変更の取り消し コマンドだけでは取り戻せなくなります。しかし、ファイルやフォルダーが全く失われてしまった訳ではありません。もしファイルやフォルダーを削除したリビジョンが分かるのであれば(分からない場合はログダイアログから探し出して)、リポジトリブラウザーを開いてそのリビジョンに切り替えます。そして、削除されたファイルやフォルダーを選択して、右クリックして コンテキストメニューコピー... を実行し、コピー先として作業コピーのパスを指定してください。

ファイルやフォルダーの移動

ファイルやフォルダーの名前をその場で変更するならば、 コンテキストメニュー名前を変更... を使用してください。新しい名前を入力すれば完了です。

作業コピー内でファイルを(例えば異なるサブフォルダーへ)移動する場合は、マウスの右ドラッグ&ドロップ操作を使用して次のように操作してください。

  1. 移動したいファイルやディレクトリを選択する

  2. 作業コピー内の新しい位置にそれらを右ドラッグする

  3. マウスの右ボタンを離す

  4. ポップアップメニューの コンテキストメニューSVN バージョン管理ファイルをここに移動する を選択する

親フォルダーでのコミット

名前の変更や移動は、削除した後に追加という形で行われるため、コミットは名前変更または移動したファイルの親フォルダーに対して行わなければなりません。そうでないと、名前変更または移動したファイルがコミットダイアログに表示されません。名前変更または移動した際の削除の部分をコミットしないと、リポジトリ上にそれが残ってしまい、共同作業者が更新した際に、古いファイルが削除されません。つまり、新旧の 両方 のファイルがある状態になってしまいます。

フォルダー内のいずれかのファイルに変更を加える前に、 必ず フォルダーの名前の変更をコミットしてください。そうしないと、作業コピーが混乱してしまいます。

ファイルの移動やコピーは、他にも Windows のコピー/切り取りコマンドを使って行うこともできます。コピーしたいファイルを選択し、右クリックしてエクスプローラーの コンテキストメニューコピー を実行します。それからコピー先のフォルダーを開いて右クリックし、 TortoiseSVN貼り付け を選択します。ファイルを移動する場合は、 コンテキストメニューコピー の代わりに コンテキストメニュー切り取り を使用します。

また、リポジトリブラウザーを用いて、項目を移動することもできます。詳細は 「リポジトリブラウザー」 をご覧ください。

外部参照の SVN 移動は行わない

svn:externals で作成したフォルダーに対して、TortoiseSVN の 移動名前を変更 コマンドを実行しては いけません 。この操作は外部参照の項目を親リポジトリから削除してしまうことになり、おそらく他の人たちを驚かせてしまいます。外部参照フォルダーを移動する必要があるときには、通常の(シェルでの)移動を行い、移動元と移動先の各親フォルダーに対して svn:externals プロパティを設定しなおしてください。

ファイル名の大文字・小文字が競合した場合の対処

リポジトリ内に、大文字か小文字かのみが異なる名前のファイル(例えば TEST.TXTtest.txt)がある場合、 Windows のクライアントでは、親ディレクトリの更新やチェックアウトができなくなります。 Subversion は文字の大小を区別していますが、Windows はそうではないからです。

これは2人が別々の作業コピーから、大文字か小文字かのみが異なる名前のファイルをコミットした場合に発生します。また Linux のような、大文字と小文字を区別するファイルシステムを使用するシステムからコミットした場合も、発生します。

この場合は、どちらかを一方のみを残し、もう一方をリポジトリから削除(または名前変更)しなりません。

2つのファイルが同じ名前にならないようにする方法

大文字・小文字が競合するようなチェックインを拒否するサーバースクリプトが、https://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/ にあります。

ファイル名の変更の修復

時に、親切な IDE がリファクタリングの一環でファイルの名前変更を行います。そしてもちろん Subversion に通知しません。変更をコミットすると、 Subversion には古いファイル名が紛失ファイル、新しいファイル名がバージョン管理外のファイルとして見えることになります。新しいファイルを追加することもできますが、 Subversion にはそのファイルの関連が分からないので、履歴が追跡できなくなってしまいます。

改善策は、実際には名前変更であったと Subversion に通知することで、これは コミット ダイアログや 変更をチェック ダイアログから行うことができます。古い名前(紛失)と新しい名前(バージョン管理外)の両方を選択し、 コンテキストメニュー移動を修復 を使用すれば、2つのファイルを名前変更の関係にすることができます。

バージョン管理外のファイルの削除

通常は、生成される全てのファイルが Subversion に無視されるように、無視リストを設定するでしょう。しかし、クリーンビルドを行うために、これらの無視される項目を削除したい場合はどうしますか?通常は、 makefile でこれを行うよう設定しますが、 makefile がデバッグ中だったり、他のビルドシステムに変更しているときには、これらを丸ごとクリアする手段があると便利です。

TortoiseSVN では、そのような場合に 拡張コンテキストメニューバージョン管理外の項目を削除... という機能を提供しています。エクスプローラーのリストウインドウ(右画面)で Shift キーを押したままフォルダーを右クリックすると、拡張コンテキストメニューが表示されます。これにより、作業コピーにあるバージョン管理外のファイルの一覧ダイアログが現れます。削除する項目を選択または選択解除してください。

ここで項目が削除される際、ごみ箱が使用されますので、ここで誤ってバージョン管理下に置くはずのファイルを削除してしまっても元に戻せます。