S-JIS[2008-12-27/2009-10-21] 変更履歴

EclipseでSubversion(SVN)

All In One Eclipse3.4にはSubversion(SVN)サーバーとやりとりするプラグイン(Subversive)が含まれている。
基本的な操作はCVSを扱うのと同じ。

 

SVNリポジトリー・エクスプローラー

SVNサーバーのモジュール一覧を表示するのが「SVNリポジトリー」というパースペクティブ。
これを開くには、以下のようにする。

  1. メニューバーの「ウィンドウ(W)」→「パースペクティブを開く(O)」→「その他(O)」で 「パースペクティブ」ダイアログを表示する。
  2. 「SVNリポジトリー・エクスプローラー」を選択する。

新しいSVNサーバーの設定

  1. SVNリポジトリーのパースペクティブの中を右クリックしてポップアップメニューを出す。
  2. 「新規(N)」→「リポジトリー・ロケーション(L)」で、「新規リポジトリー・ロケーション」ダイアログを出す。
  3. SVNリポジトリーの情報を入力し、「終了」ボタンをクリック
    項目 内容
    URL SVNサーバーの接続プロトコルとホスト svn://localhost/
    ラベル   ラベルとしてリポジトリーURLを使用
    ユーザー(U) SVNサーバーへ接続する為のユーザー hishidama
    パスワード(P) SVNサーバーへ接続する為のパスワード abc

これで、SVNリポジトリー・エクスプローラーにSVNリポジトリーが表示されるはず。


SVNリポジトリー・エクスプローラー内での操作

CVSリポジトリー・エクスプローラーは初回のロケーション登録とチェックアウト(あとはリポジトリー内のファイル確認)くらいしか使わないが、
SVNリポジトリー・エクスプローラーではそこからディレクトリーを作成したり移動したりすることが出来る。[2008-12-29]

svnコマンドではリポジトリーに対して直接操作する命令があるので、それを行うのだろう。
ただ、コマンドを実行する度にコミットする必要があるので、ある程度変更をまとめてコミットしたいのであれば、一度チェックアウトしてから操作する方が良さそう。

ディレクトリー指定時の操作
メニュー 概要 SVNコマンド相当
新規(N) ファイル(F) 別の場所にあるファイルをインポートする。 svn import
フォルダー(O) ディレクトリーを作成する。 svn mkdir
ブランチ(B) ブランチを作成する。(branchesディレクトリーへコピーする) svn copy
タグ(T) タグを作成する。(tagsディレクトリーへコピーする) svn copy
プロジェクト構造(P) trunk・branches・tagsディレクトリーを作成する。 svn mkdir
リポジトリー・ロケーション(L) Eclipseの新しいロケーションを作成(URLを登録)する。  
チェックアウト(C) Eclipseのプロジェクトとしてチェックアウトする。 svn checkout
検索/チェックアウト(F) 既存プロジェクトの一部として等。 svn checkout
コピー(O) コピーあるいは移動。
「貼り付け」時に実行する。
svn copy
svn move
切り取り(T)
貼り付け(P)
削除(D) ディレクトリーを削除する。 svn remove
URLのコピー ディレクトリーのURL(svn://〜)をクリップボードにコピーする。  
リファクタリング(R) 名前変更(R) ディレクトリー名を変更する。 svn move
次へコピー(C) ディレクトリーをコピーする。 svn copy
移動(M) ディレクトリーを移動する。 svn move
ヒストリーの表示(H) そのディレクトリーの変更履歴を「ヒストリー」ビューに表示する。 svnlook history
svn log
プロパティーの表示 プロパティー(属性)一覧を「SVNプロパティー」ビューに表示する。 svn proplist -v
パッチの作成 比較したファイルを作成する。
ファイルだけでなく、クリップボードへ直接作成できる。
svn diff
改訂リンクの追加(A) 改訂リンクを作成する。  
エクスポート エクスポートする。 svn export
インポート(I) インポートする。 svn import

ファイル指定時の操作
メニュー 概要 SVNコマンド相当
新規(N) ブランチ(B) ブランチを作成する。(branchesディレクトリーへコピーする) svn copy
タグ(T) タグを作成する。(tagsディレクトリーへコピーする) svn copy
リポジトリー・ロケーション(L) Eclipseの新しいロケーションを作成(URLを登録)する。  
開く(O) ファイルを開く。 svn cat
アプリケーションから開く(H)
コピー(O) コピーあるいは移動。
「貼り付け」時に実行する。
svn copy
svn move
切り取り(T)
貼り付け(P)
削除(D) ファイルを削除する。 svn remove
URLのコピー ファイルのURL(svn://〜)をクリップボードにコピーする。  
リファクタリング(R) 名前変更(R) ファイル名を変更する。 svn move
次へコピー(C) ファイルをコピーする。 svn copy
移動(M) ファイルを移動する。 svn move
ヒストリーの表示(H) そのファイルの変更履歴を「ヒストリー」ビューに表示する。 svnlook history
svn log
注釈の表示(A) 変更履歴付きでファイルの内容を表示する。 svn annotate
プロパティーの表示 プロパティー(属性)一覧を「SVNプロパティー」ビューに表示する。 svn proplist -v
パッチの作成 比較したファイルを作成する。
ファイルだけでなく、クリップボードへ直接作成できる。
svn diff
改訂リンクの追加(A) 改訂リンクを作成する。  
エクスポート エクスポートする。 svn export
インポート(I) インポートする。 svn import
ロックを中断(B) ロックを強制的に解除する。 svn unlock --force
比較 URL 比較対象をURLで指定する。(同一リポジトリー内のみ) svn diff
ブランチ 別途branches内のファイルを指定し、それと比較する。
タグ 別途tags内のファイルを指定し、それと比較する。
相互 選択されている2つのファイルを比較する。(同一リポジトリー内のみ)

プロジェクト構造

要するに、trunk・branches・tagsディレクトリーのこと。それらを作成する機能。[2008-12-29]

プロジェクト構造(P)」メニューを選択すると、「プロジェクト構造の作成」ダイアログが開く。

作ろうとした場所に既にtrunk・branches・tagsのいずれかのディレクトリーが存在していると、作成に失敗する。
(無いディレクトリーだけ追加されたりはしない)


改訂リンク

Eclipse(Subversive)の機能。[2008-12-29]
普通はSVNリポジトリー・エクスプローラー内には最新時点のツリー(trunk・branches・tagsを含む)しか無いが、過去のある時点のリビジョンのツリーを簡単に見ることが出来る。
いわば、そのリビジョンの「スナップショットをとる」「ショートカットを作る」「タグを付ける」イメージ。
CVSリポジトリー・エクスプローラーで日付を指定してブランチやタグを準備するのと似ている)

改訂リンクの追加(A)」メニューによって改訂リンクを作成する。
すると、SVNリポジトリー・エクスプローラー内のロケーション直下の「REVISIONS」という要素の下に指定したリビジョン番号(あるいは日時)の要素が作られ、その下にその時点のツリーが表示される。
このツリーは参照専用であって、その中のファイルは編集できない。こっちの方がよっぽど『タグ』っぽい気がする(苦笑)


プロジェクトの共用

SVNでEclipseのプロジェクトを管理するには、「共用」する。

  1. パッケージエクスプローラーから、SVNに登録したいプロジェクトを右クリックして「チーム(E)」→「プロジェクトの共用(S)」で「プロジェクトの共用」ダイアログが開く。
  2. リポジトリータイプから「SVN」を選択して「次へ」。
  3. 「新しいリポジトリー・ロケーションを作成」または「既存のリポジトリー・ロケーションを使用」を選択する。
  4. 例えば「リポジトリー上の名前」に「プロジェクト名を使用」 、「プロジェクト・リポジトリー・レイアウト」に「リポジトリー・ロケーション・レイアウトを使用」を選択する。
    すると、「svn://localhost/trunk/プロジェクト名」が使われることになる。
    (SVNでは、トランクはtrunkというディレクトリー内にモジュール(ディレクトリー)を作るのが一般的らしい)
  5. 「終了(F)」
  6. SVNサーバーに対して新しいファイルがあった場合は、コミットする必要がある。

SVNサーバーへの接続中に以下のような「操作が失敗しました」ダイアログが出てエラーとなる場合、SVNサーバー側の設定(権限)がおかしいかも。[2008-12-28]

プロジェクトの共用に失敗しました。
svn: ファイル 'C:\svn\sample\db\txn-current-lock' を開けません: アクセスが拒否されました。 

SVNの操作

SVNで共用したプロジェクト内のファイル・ディレクトリーに対しての操作。[2008-12-29]

メニュー   概要 SVNコマンド相当
チーム(E) リポジトリーと同期化(S) DF リポジトリーと比較する。 svn status
コミット(C) DF コミットする。 svn commit
更新(U) DF 最新状態を取り込む。 svn update
パッチの作成(A) DF 差分ファイルを作成する。 svn diff
パッチの適用(Y) DF 差分ファイルを適用する。 patch

戻す(R) DF ローカルの修正を無しにする。 svn revert
バージョン管理に追加(A) DF 新規に追加する。 svn add
svn:ignoreに追加(I) DF 無視する(SVN管理外とする)。 svn propset svn:ignore
競合の編集 DF 差分を表示して編集できる状態にする。 svn update→p(延期)
マージ済みとマーク F 競合が解決されたことをEclipseに教える。 svn resolve

ブランチ(B) DF ブランチを作成する。 svn copy
タグ(T) DF タグを作成する。 svn copy
マージ(M) DF マージする。 svn merge
切り替え(W) DF   svn switch?

ヒストリーの表示(H) DF 改訂履歴を表示する。 svnlook history
svn log
ローカル・ヒストリーの表示(H) F Eclipse内での改訂履歴を表示する。  
注釈の表示(A) F 変更履歴付きで内容を表示する。 svn annotate

ロック(L) DF ロックする。 svn lock(--force)
アンロック(N) DF ロックを解除する。 svn unlock(--force)

プロパティーの表示(P) DF プロパティー(属性)一覧を表示する。 svn proplist
プロパティーの設定 DF プロパティー(属性)を追加する。 svn propset
キーワードの設定 DF キーワード置換の可否を設定する。 svn propset svn:keywords

次へコピー DF 別の場所へコピーする。 svn copy
エクスポート DF エクスポートする。 svn export
クリーンアップ(L) D クリーンアップする。 svn cleanup
比較(A) 作業コピーからBase(B) DF 自分の変更前状態と比較する。 svn diff
リポジトリーから最新(L) DF リポジトリーの最新版と比較する。
改訂またはURL(U) DF 別リビジョンと比較する。
ブランチ DF ブランチ内のものと比較する。
タグ DF タグ内のものと比較する。
相互(E) DF 選択されている2つものを比較する。 diff
ローカル・ヒストリー(L) F Eclipse内のバックアップと比較する。

クリップボード F クリップボード内の文字列と比較する。  
ワークスペース・ファイル F Eclipse内の別ファイルと比較する。  
外部ファイル F 別ファイルと比較する。  
開いたエディター F 開いている(タブに並んでいる)ファイルと比較  
置換(L) リポジトリーから最新(L) DF リポジトリーの最新版で置き換える。  
改訂またはURL(U) DF 別リビジョン版で置き換える。
ブランチ(B) DF ブランチから置き換える。
タグ(T) DF タグから置き換える。
ローカル・ヒストリー(L) F Eclipse内のバックアップから置き換える。  
ローカル・ヒストリーの前回のものと置換(P) F 直前のバックアップから置き換える。

クリップボード F クリップボード内の文字列を貼り付ける。 Ctrl+V(貼り付け)
ワークスペース・ファイル F Eclipse内の別ファイルから置き換える。 Ctrl+Shift+R(リソース)
外部ファイル F 別ファイルから置き換える。 copy
開いたエディター F 開いている(タブに並んでいる)ファイルの内容 copy

コミット

コミットする為のダイアログ。[2009-10-21]

「チーム」→「コミット」メニューや同期化ビューの「コミット」で「コミット」ダイアログが開く。

コミット対象一覧の行をダブルクリックすると、そのファイルのリポジトリーとの差分が比較用ダイアログで表示される。
Eclipse3.4のCVSと同様)

ただし、変更内容がプロパティーの場合は、比較しても何も差が出ない。
(そういう時は、コミット対象一覧の右側の「プロパティー」欄にModifiedとか出ているはず。
 プロパティーがどう変わったのかも分かると便利なんだけど…)


パッチの作成・適用

差分をパッチ(テキストファイル)の形で保持し、別ファイルに適用することで同じ変更を施すことが出来る。 [2009-10-21]

「チーム」→「パッチの作成」メニューで「パッチの作成」ダイアログが開く。

また、(CVSのパッチの作成と異なり、)ヒストリービュー上から作成することも出来る。

  1. ヒストリービューを開く。
  2. パッチを作成したいバージョンを選択する。

2つのバージョンを選択した場合、その間の全ての変更を取り込んだパッチとなる。


「チーム」→「パッチの適用」メニューで「パッチの適用」ダイアログが開く。

パッチを適用する際は、念の為、どういう変更になるか差分を確認した方がいいだろう。
コミットダイアログと似た感じで変更対象一覧が表示され、変化を見ることが出来る)


ヒストリービュー

ファイルやディレクトリーの改訂履歴を表示するビュー。[2008-12-29]
改訂(リビジョン番号)、日付、作成者、コメント(コミット時のログメッセージ)の一覧表。

「チーム」→「ヒストリーの表示」メニューやSVNリポジトリーエクスプローラーの「ヒストリーの表示」メニューでヒストリービューを開く。

「エディターおよび選択にリンク」エディターおよび選択にリンクボタンを押してオンにしていると、SVN配下のファイルを開く度に自動的にヒストリーが表示される。[2009-02-14]
色んなファイルの履歴を確認していきたい場合に便利。


SVNプロパティービュー

ファイルやディレクトリーのプロパティー(属性)の名前と値を表示するビュー。[2008-12-29]
(リビジョンに対するプロパティー(属性)はRevision Propertiesビューで照会する)

「チーム」→「プロパティーの表示」メニューやSVNリポジトリーエクスプローラーの「プロパティーの表示」メニューでSVNプロパティービューを開く。

右クリックメニューで属性の追加・編集・削除が行える。
ディレクトリーへ属性を追加/変更する時に「プロパティーを再帰的に適用」することも出来る。(svn propset --recursive)
また、「Apply Recursively」メニューで、既存の属性をサブディレクトリーに適用できるのも便利。
フィルターオプションで、ファイルのみ・ディレクトリーのみ・全てという具合に、適用する対象を絞り込むことも出来る。


Revision Propertiesビュー

リビジョンに対するプロパティー(属性)の名前と値を表示するビュー。[2008-12-29]
つまり、svn info(やsvnlook info)で表示されるような情報(更新者(svn:author)、更新日時(svn:date)、コミットログメッセージ(svn:log))が確認できる。

ヒストリービューから履歴の行を右クリックして「改訂プロパティーの表示」を選ぶことで、その履歴(リビジョン)のプロパティーが表示される。

また、ここから属性値を変更することも出来る。
(SVNサーバー側のpre-revprop-changeフックで“リビジョンの属性値の変更を許可する”よう設定されている必要有り)


リファクタリングとの関係

Eclipseのリファクタリング機能に連動してSVNの操作も行われる。[2009-01-18]

リファクタリング操作 SVNとの関係 svnコマンド
クラス名変更 ソースファイル名(拡張子.java)も改名される。 svn rename
クラス移動 クラスを別パッケージへ移動すると
ソースファイルの置かれているディレクトリーが変わる。
svn move
パッケージ名変更 パッケージ名を変更すると、そのディレクトリー名変更と共に
内部のクラスファイルのパッケージ名が変更される。
コミット時にエラーが出た場合の対処方法
ディレクトリーのsvn move

ソースファイルの移動(クラス名の変更)は、実質的に削除+新規追加の操作となる。(svn moveコマンドの動作と同じ)

新しいファイルを追加した直後(コミット前)に履歴を見ると、リポジトリー(SVNサーバー)側にそのファイルは存在しないので、何も出てこない。
しかし、移動前(改名前)の履歴もちゃんと残っており、コミットすれば参照することが出来る。

コミット前でも、リポジトリーと同期化すると、ちゃんと変更前のファイルと比較できる。[2009-01-20]
同期化でなく比較を用いると、新規扱いなので古いソースとは比較できない。


パッケージ名変更を行った後にそのままコミットしようとすると、エラーになる。
ダイアログ名: 未解決の競合
メッセージ: ディレクトリ'〜'はリポジトリ側と比べて古くなっています
削除された側(古い方)のディレクトリーの管理情報が何かおかしくなっているらしい。
この場合、(全体を)更新してからコミットすればよい。
(パッケージ内部のファイルの履歴もちゃんと保持・変更される)


削除したファイルを復活させる方法

SVNリポジトリー・エクスプローラーを使って、過去に削除したファイルを復活させることが出来る。[2009-01-27]

  1. SVNリポジトリー・エクスプローラーで、タグ改訂リンクから、復活させたい(削除された)ファイルを見つける。
  2. 削除されたファイルを右クリックし、「コピー(O)」を選択する。
  3. 復活させたい場所(trunkやbranchのディレクトリー)で右クリックし、「貼り付け(P)」を選択する。
  4. コミットを確認するダイアログが開くので、コミットコメントを入力し、OKボタンを押下する。

もしくは、

  1. 削除されたファイルを右クリックして「リファクタリング(R)」→「次へコピー(C)」を実行する。
  2. 「次へコピー」ダイアログが開くので、復活させたい場所(trunkやbranch)を選択し、終了ボタンを押下する。

リポジトリーからリポジトリーへ直接コピーするので、毎回コミットが必要。
かつ、1ファイルずつ実行になるので、まとめてコミットすることは出来ない…。
svn copyコマンドによる、URL→URLの方法と同様)
(svn copyコマンドでは、リポジトリーからワークへ復活させる方法も出来るのだが、Subversiveでは出来なさそう…)


Eclipse目次へ戻る / 技術メモへ戻る / SVN考察へ行く
メールの送信先:ひしだま