情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | 編集

Subversionのpre-revprop-changeフックに関するエラー このエントリーを含むはてなブックマーク

エラー

エラーの内容は、こちら。

SVN: 'Set revision author' operation finished with error: svn: リポジトリが、リビジョン属性を変更できるようにはなっていません。
管理者に pre-revprop-change フックを作成するよう頼んでください
svn: リポジトリが、リビジョン属性を変更できるようにはなっていません。
管理者に pre-revprop-change フックを作成するよう頼んでください

このエラーは、Eclipse用プラグインSubversiveを利用してレポジトリへのコミットを行ったときに発生したものです。とりあえず、「pre-revprop-change」ファイルが無いことが問題なので、次のようにして作成しました。

pre-revprop-changeファイルを作成する

作成と言っても、デフォルトファイルpre-revprop-change.tmplhooksディレクトリにあるので、レポジトリのディレクトリに移動して、

cp hooks/pre-revprop-change.tmpl hooks/pre-revprop-change

のようにコピーするだけです。簡単ですね。

エラー再び

とりあえず、pre-revprop-changeファイルを作成することには成功しましたが、コミット時にまたもやエラーが。

SVN: 'Set revision author' operation finished with error: svn: 'pre-revprop-change' フックが次のようなエラーを出力して失敗しました:
Changing revision properties other than svn:log is prohibited

svn: 'pre-revprop-change' フックが次のようなエラーを出力して失敗しました:
Changing revision properties other than svn:log is prohibited

今度は、少しエラーの内容が異なります。ここで気がついたのですが、実はコミット時に、Subversionで簡単に使えるとある機能を使っていました。それが原因でした

その機能とは、コミットするユーザ名(Author)を変更(設定)する機能ですこれは、Subclipseでは(おそらく)できない機能ですやりかたは簡単で、レポジトリの設定(レポジトリプロパティ)の「Advanced>Override author name with represented below:」に、Authorとして登録したい名前を入力するだけです。たとえば、SVN+SSHを利用しているときは、SSHのログインユーザ名でコミットしてしまいますが、この設定を利用することで好きな名前に変更できます。

さて、これがどうエラーと関係しているかというと、エラー冒頭の「Set revision author」と関係しています。つまり、authorを変更(設定)するときにエラーが発生しているのです。もう少し細かく言うと、実は、pre-revprop-changeファイル内の設定で、authorの書き換えを禁止しているのが問題なのです。そこで、先ほど作成したデフォルトのpre-revprop-changeファイルの

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

の次の行に

if [ "$PROPNAME" = "svn:author" ]; then exit 0; fi

を追加してauthorの書き換えを許可してあげます。これで、Authorを変更(= svn:authorを変更)出来るようになりました。

成果

もう一度コミットしてみると、正しく終了します。そして、Historyでコミットしたファイルを見てみると、たしかにAuthorの欄が設定した名前になっています。めでたしめでたし。

Subversive便利

Authorを手軽に設定できることも便利ですが、そのほかにもSubclipseより便利なところがたくさんありました。細かいところですが、たとえばプロキシサーバを簡単にレポジトリごとに設定できるところや、SVNやSSHの接続ポートを簡単に設定できるところです。Subclipseユーザの型は、是非一度Subversiveを使ってみてくださいただ、SubclipseとSubversiveを一つのeclipseに同時にインストールするのはやめた方がいいです

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)
実用 Subversion 第2版
入門Subversion―Windows/Linux対応

スポンサーサイト
Subversion | コメント:0 | トラックバック:0 | 編集

subclipseでupdate時に衝突した場合の解決方法 このエントリーを含むはてなブックマーク

一人利用だとsubversionを利用していてもコミット時に衝突することなどなかったのですが、実際に衝突してみて分かったことをメモ

subclipseでの衝突表示

update(更新)実行時に、自分が変更を加えたリビジョン(rev9)より新しいリビジョン(rev10)がすでにコミット済みで、変更位置が重なっていた場合、衝突が発生します。つまり、編集箇所がかぶってしまった場合に発生するわけです。

衝突が発生すると、衝突が発生した箇所に

<<<<<<< .mine
=======
>>>>>>> .r10
という3つの行が現れます。どうやらこれらは、
(衝突に関係ないところ)
<<<<<<< .mine
(updateしようとしたときの作業コピーの内容)
=======
(すでにコミットされていたレポジトリrevision10の内容)
>>>>>>> .r10
(衝突に関係ないところ)
という意味みたいです。つまり、自分の作業コピーの内容に戻すには、「=======」から「>>>>>>> .r10」までを削除すればいいわけです。

修正してコミットしてみる

上記のように、衝突時、ファイルに><が大量に書き込まれてしまうので、手元でファイルを修正してコミットします。しかし、以下のようなエラーが発生してしまいます。

'SVNコミット' has encountered a problem.

org.tigris.subversion.javahl.ClientException:
A conflict in the working copy  obstructs the current operation
svn: Commit failed (details follow):
svn: Abortingj commit:
'D:\...\workspace\作業コピーの場所\ClassName.java'
remains in conflict
衝突を修正したはずなのにどうすればよいのか。

どうすればいいのか

衝突していた場所を適切に修正したのにエラーが表示されたわけですが、ではいったいどうすればいいのか。

エラー本文に「remains in conflict」とありますが、これは内容的な衝突が残っているということではなく、とあるファイルが残っていることを示しています。たとえば、ClassName.javaファイルが衝突していた場合、同じファイル階層に

ClassName.java.mine
ClassName.java.r9
ClassName.java.r10
の3つが作成されているはずです。「.mine」ファイルが自分の作業コピー、「.r9」が自分が変更を加えていたリビジョン、「.r10」がすでにレポジトリにコミットされていた内容を表したファイルです。これらが削除されるまで「remains in conflict」が残ってしまいます。つまり、これら3ファイルを削除すればOKです

具体的な方法

まず、.java.mine、.java.r??ファイルなどを参考にしながら、もともとの作業コピーである.javaファイルを修正します。

続いて、「Package Explorer」上の.javaファイルを右クリックして、「Team>解決済みにマーク」をクリックし、「解決済みにマーク」ダイアログを表示させます。

What do you want to do?
  • Conflicts have been resolved in the file.
  • Resolve the conflict by using my version of the file.
  • Resolve the conflict by using the incoming version of the file.
  • Resolve the conflict by using the base version of the file.
ここで、「Conflicts have been resolved in the file」を選択すれば完了ですcf. $svn help resolved

強制的に上書きしたいときは

このような衝突時に強制的に自分の作業コピーでレポジトリを上書きしたい場合は、「Resolve the conflict by using my version of the file.」を選択すればOKです。

まとめ

衝突したときは、機械的に生成される「.mine」「.r最新の番号」「.r古い番号」という3ファイルをどうにかして削除する必要があり、削除には、「解決済みにマーク」を利用するのがよい。

バージョン管理ってすごく便利だけど、機能がたくさんあって難しい。

Subversion | コメント:0 | トラックバック:0 | 編集

Subclipseのsvn+ssh利用時のポート番号について このエントリーを含むはてなブックマーク

なんかSubclipseでsvn+sshを利用するとき、ポート番号を指定しても意味がないというか反映されていないようなので報告メモ

Subclipseでポート番号を指定してみる

Subclipseでsvn+sshを利用するときに、ポート番号(port)を

svn+ssh://username@hostname:port/repos/myrepos
のようにして、ポート番号の指定をしてみました。ただ、そのポート番号の様子がおかしい。

ポート番号にどんな番号を指定しても、常にSSHのデフォルトである22番ポートを使っているような気がしてきたので、Wiresharkで調べてみると、確かにどんな番号を指定しても22番ポートを利用しています。なので、

svn+ssh://username@hostname:10000000000/repos/myrepos
なんていう無茶な設定から
svn+ssh://username@hostname:99/repos/myrepos
なんていう微妙な設定まで、どう設定しようと22番ポートを利用しているようなのです。

Subclipseのソースコードをちょっと読んでみた

Subclipse自体のソースコードをチェックしてみたところ、URLのパース自体はちゃんとやっているみたい。ただ、それ以上どのタイミングでポート番号を指定して利用しているかがちょとすぐには見つからないのではっきりしません。すいません。

ポート指定方法はあるけれど

Subclipseの設定ファイルを利用して、ポート番号を指定することは確かにできるみたいなのですが、レポジトリごとの設定ができない模様。不便すぎる。

まさか

実は上記のポート番号の指定方法が間違っているのかもしれないんですけど、とりあえず、適当に入力しても何のエラーにもならないのは問題かと。とりあえず、もうちょっと調べてみようかな。

Subversion実践入門
実用SSH
Eclipse 実践開発入門

Subversion | コメント:0 | トラックバック:0 | 編集

svnコマンドをSubclipseで実行しチェックアウトする このエントリーを含むはてなブックマーク

オープンソースソフトウェアは、ソースコードのダウンロード方法として、コマンドラインだけ提示されていることがあります。今回は、そういう場合にコマンドラインを使わず、Subclipseを利用してソースコードをダウンロードしてみます。

SubclipseをSubclipseでチェックアウトしよう

EclipseプラグインSubclipseのソースコードを、まさにそれ自体であるSubclipseでチェックアウトしてみます。

コマンドラインによるチェックアウト方法は書いてある

Subclipseの公式ページには、ソースコードをチェックアウトする方法として、

svn checkout http://subclipse.tigris.org/svn/subclipse/trunk subclipse --username guest
というコマンドが提示されています。これは、コマンドラインを利用する場合の方法です。このコマンドによって、guestユーザの権限で、subclipseというディレクトリにtrunkフォルダ内のソースコードがチェックアウトされます。

ただ、Subclipseに直接このようなコマンドを入力することはできません。また、Subclipseに限らず、このようにコマンドラインでのチェックアウト方法だけが書いてあることは多々あります

Subclipseでチェックアウトする

まず、パッケージエクスプローラ(Package Explorer)上の何もないところで右クリックをして、「Import...(インポート)」を選択しますEclipseを日本語化していないので、日本語表記は怪しいです。日本語化している人の方が少数派ですよね。。。

続いて、表示された選択肢の中から、「SVN>SVNからプロジェクトをチェックアウト」を選択し、「Next>」をクリックします。

ロケーションの選択/生成画面が表示されたら、「新規レポジトリー・ロケーションを生成」を選択して「Next>」をクリックします。

次は、ロケーションを求められます。ここでは、ロケーションとして、

svn://guest@subclipse.tigris.org/svn/subclipse/trunk
なんかに勝手にしないことです。なんとなく、「subversionだから、svn://とかあったよな」という考えでこのようにしてはいけません。なぜなら、svn://は、svnサーバが提供されている場合しか使えず、あくまでhttp://でアクセスしろと言うことなので、余計なことはしてはいけないからです。じゃぁ、どうすればいいかというと、ここは普通に
http://subclipse.tigris.org/svn/subclipse/trunk
と入力してください。入力後、「Next>」をクリックします。

続いて、「ユーザ名とパスワードの入力」画面が表示されるので、

ユーザ名:guest
パスワード:<何も入力しない!>
とします。パスワードを保存しても何も困らないので、「パスワードを保存する」にチェックを入れておくといいかもしれません。入力後、「OK」です。

すると、以下のようにチェックアウトするフォルダの候補がずらっと表示されます。

subclipse
subclipse_mylyn
subclipse_mylyn3
svnClientAdapter
svnant
www
ここで、チェックアウトしたいプロジェクトのフォルダを選択して「Next>」です。普通は「subclipse」ですね。

すると、「チェックアウトの方法とリビジョンの選択」画面が表示されます。

フォルダ subclipse をチェックアウトする方法を選択してください
  • 新規プロジェクトウィザードを使ってプロジェクトとしてチェックアウト
  • プロジェクトとしてワークスペースへチェックアウト
では、「プロジェクトとしてワークスペースへチェックアウト」が選べる場合は選んでしまった方が楽です。 また、
Check out HEAD revision
にチェックを入れることで、最新版がチェックアウトされます。通常、チェックを入れたままにしましょう。

残りのオプションですが、「Depth」は、「Fully recursive」を選択してください。Fully recursive以外だと、すべてのファイルがチェックアウトされません。また、「Ignore externals」にチェックを入れると、外部参照を無視してしまいます。普通はチェックを入れてください。「Allow unversioned obstructions」にチェックを入れないと、ローカルフォルダにたまたまあったバージョン管理されていないファイルと衝突した場合、チェックアウトがキャンセルされます。これはそのままでいいと思います。 以上の入力が完了したら「Next>」。

最後に「プロジェクトのロケーション選択」画面が表示されるので、必要に応じてワークスペースを選択してください。選択したら、いよいよ「Finish」です。

Javaプロジェクトとしてチェックアウトしたい

Javaプロジェクトとしてチェックアウトしたい場合など、プロジェクトのタイプを指定したい場合は、

フォルダ subclipse をチェックアウトする方法を選択してください
  • 新規プロジェクトウィザードを使ってプロジェクトとしてチェックアウト
  • プロジェクトとしてワークスペースへチェックアウト
で「新規プロジェクトウィザードを使ってプロジェクトとしてチェックアウト」を選択してください。直後の画面で、「Java>Java Project」を選択してください。ほかにもいろいろありますが、適切なものを選択してくださいここでまた「SVN>SVNからプロジェクトをチェックアウト」にしてしまうと、無限ループが始まってしまうので注意

ちなみに、Subclipseをチェックアウトするなら「Plug-in Project」でいいんでしょうかね。

おわり

以上でチェックアウト終了です。

追記:Subclipseをチェックアウトするとき

チェックアウトをプロジェクトごとに行うなら、「/trunk/subclipse」ではなく一つ深い階層のたとえば「/trunk/subclipse/org.tigris.subversion.subclipse.core」を選択して「プロジェクトとしてワークスペースへチェックアウト」をチェックしてチェックアウトしてください。すると、.projectファイルがあるので、正しくチェックアウトできます。

Subversion実践入門
実用SSH
Eclipse 実践開発入門

Subversion | コメント:0 | トラックバック:0 | 編集

Eclipseでsvn+sshを行う方法(Putty+Subclipse@Windows)メモ このエントリーを含むはてなブックマーク

Eclipseでsvn+ssh(SSH接続を介したSubversionの利用)を行う方法について、おおざっぱなメモをしておきます

対象環境

今回の対象環境は、Windowsで、Eclipseを使用します。Eclipse用SubversionプラグインとしてSubclipseを利用し、Windows用SSHクライアントとしてPuttyを利用します。

手順概要

  1. 環境変数(ユーザ環境変数)に、変数SVN_SSHを追加して、値をPuttyに含まれるプログラムplink.exeへのフルパスにする。このとき、フォルダの区切りは"\"ではなく、"/"(スラッシュ)を利用すること。以下、例を示す。

    変数:SVN_SSH
    値:D:/putty/plink.exe

  2. putty.exeでいったんサーバにSSH経由でログインを試みる。初回ログイン時、

    ---------------------------
    PuTTY セキュリティ警告
    ---------------------------
    このサーバの鍵はレジストリにキャッシュされていません。
    このサーバがあなたの期待するコンピューターである
    という保証はありません。
    
    このサーバのrsa2鍵の指紋は次の通りです:
    ssh-rsa 2048 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
    
    このホストを信用するのであれば、「はい」を押して
    PuTTYのキャッシュに鍵を追加し接続してください。
    
    キャッシュには追加せずに一度だけ接続したいので
    あれば、「いいえ」を押してください。
    
    このホストを信用しないのであれば、「キャンセル」
    を押して接続を破棄してください。
    
    ---------------------------
    はい(Y)   いいえ(N)   キャンセル   ヘルプ   
    ---------------------------
    
    という内容の警告表示されるので、ここで「はい」を選択し、サーバの鍵をレジストリにキャッシュします。

  3. subversionレポジトリをサーバで作成しておく。/reposディレクトリにレポジトリを作成し、SSHログインするユーザ名をusername、レポジトリへのアクセスを許可するユーザグループをsvnusersとする場合、コマンドは

    ■usernameをsvnusersグループへ
    #groupadd svnusers
    #/usr/sbin/usermod -G svnusers username
    
    ■レポジトリ作成
    #mkdir /repos
    #svnadmin create /repos/myrepos
    
    ■パーミッション設定
    #chmod -R 775 /repos/myrepos
    #chown -R root:svnusers /repos/myrepos
    となる。

  4. EclipseにSubclipseをインストール
  5. 「ウィンドウ>設定>チーム>SVN」のSVNインターフェースで、JavaHLが選択されていることを確認。SVNKit(Pure Java)などになっていた場合は、JavaHLに変更する。

  6. puttyに含まれるpagent.exeを起動し、タスクトレイのアイコン右クリックから「鍵の追加」からPutty用秘密鍵ファイル(*.ppk)を登録し、要求されたパスフレーズを入力。

  7. レポジトリをEclipseに登録する。具体的には、いくつか方法があり、

    • ファイル>インポート>Select an import source>SVN>SVNからプロジェクトをチェックアウト
    • プロジェクトを右クリック>チーム>Share Project...>SVN
    • レポジトリエクスプローラで右クリック>新規>レポジトリロケーション
    などがありますが、どの方法でも、新規にレポジトリロケーションを作成することになります。レポジトリロケーションの作成とは、既存のレポジトリを指定することなのですが、その際URLで指定します。先の例で、ホストのアドレス(IPアドレス)をhostnameとすると、そのURLは
    svn+ssh//username@hostname/repos/myrepos
    となります。URL指定後、うまく読み込むことができれば、Subclipse+Puttyを利用したsvn+ssh環境の構築は成功したことになります。URLに関する参考資料「svn+ssh://の後に続くパスについて

以上で、おおざっぱですが手順終了です。

Subversion実践入門
実用SSH
Eclipse 実践開発入門

Subversion | コメント:0 | トラックバック:0 | 編集
 | HOME |  OLD >>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。