git-svn で trunk/branch を扱う時の話(暫定)

Subversion で管理されているファイル群を git で利用する際、Subversion 側の trunk, branch を扱う際のフローの現在までのまとめ。まだがっちり運用に至ってないので、若干の手直しが入る可能性もあり。

なおここでは Piece_ORM を例に。あと、git 云々の話はここでは触れない。(まだよーわかってないけど。)

clone 時 branch とかを指定する

git svn clone http://piece-orm.svn.sourceforge.net/svnroot/piece-orm -T trunk -b branches -t tags

これで branch とか tags の情報が git branch -r で見える。ただしローカルのブランチではない。(後述にて補足)

% git branch -r
1.0
branch-1.0
trunk

なぜか svn mv して消えたはずのブランチまで見えちゃってる。

ちなみに git branch しても、ローカルでは master しかないことになってる。

% git branch
* master

なおリモート先のツリーが更新 (ブランチが増えたとか) された場合、fetch して更新する。最後の引数の svn は fetch 対象として指定している名称で、.git/config にこの子の事が初期値として登録されている。変更したり増やしたりも出来る。

git svn fetch svn

ローカルブランチを作る

前述のとおり、clone 時に trunk やら branch やらを指定したものの、clone が終わった直後のローカルには master しかないことになっている。ここで git branch とかをやると、「移動したけど、これはローカルのブランチじゃあねえよ」とか言われる。

注意を言われると同時にローカルブランチの作り方を教えてくれるので、その通りにやる。

git checkout -b branch-1.0 branch-1.0

-b 以後の値のうち、前半はローカルブランチ名、後半はリモートのブランチ名。これで、ローカルブランチに branch-1.0 ができるので、git checkout branch-1.0 とかやればよい。

masterブランチをtrunkと等価にする

一見、svn の trunk が git の masterブランチとして作成されているように見せかけて、実際はそうではないケースがある。そうではないというのは、git svn dcommit する対象のリポジトリ URL が、trunk になっていないという状態のこと。恐らく、最後の変更 (ヘッドリビジョン) の対象となった箇所が master として作成されており、場合によっては branch や tags になっている場合がある。

対象ブランチのリポジトリURLがどうなっているかは、git svn info でみれる。この例では、11/14 時点の Piece_Right の info。URL が branches/1.0 になっている。もちろんこのままでは、dcommit する対象は branches/1.0 になってしまう。

% git svn info

Path: .
URL: https://piece-right.svn.sourceforge.net/svnroot/piece-right/branches/1.0
Repository Root: https://piece-right.svn.sourceforge.net/svnroot/piece-right
Repository UUID: 2263376b-7820-3741-b83e-21f0075cfe57
Revision: 475
Node Kind: directory
Schedule: normal
Last Changed Author: iteman
Last Changed Rev: 475
Last Changed Date: 2008-07-28 19:48:51 +0900 (月, 28 7月 2008)

ので、思い切って現在作成されている master ブランチを一度消去して、もう一度 trunk を指定して master ブランチを作ってしまう。

git branche -d master
git checkout -b master trunk

これで、master といえば trunk のことを指すようになる。

master と trunk は別!という風にしたいのであれば、master ブランチはそのままにしておいて trunk ブランチを別途作るのも。master = trunk とは言い切れないけども、少なくとも git においてはそのリポジトリのリビジョンヘッドのことじゃあないはず、なので trunk 化してしまっていいのではないかなと。

Emacs (snapshot) の起動プログラム

Emacsを起動する場合、通常はコマンドラインから emacs と叩いたりアプリケーションメニューから選んだりというようなことをしますが、本音をいうと以下のようなことを考慮しながら都合よく振る舞いたいものです。

  1. Emacsは基本1つしか立ち上げず、ファイル編集を行う際には全て起動済みの Emacs を使う。ターミナルからファイルを指定しての編集をするのも同様。
  2. Emacsが既に立ち上げっているかどうかなどは考慮する必要はないようにする。

前者の方は、やはり Emacs の起動は若干時間がかかるし、新しいEmacs のウィンドウが2個も3個も立ち上がっているのは格好悪いので、やはり1つ立ち上げておいた Emacs で編集が全て行えるように。
後者の方は、前者の話をクリアする際にあわせて、事前に emacs を立ち上げておいて〜ということはないように。

このような振る舞いを行う機構としては、emacsclient というものを利用すればOKで、まあ結局のところ、EmacsWiki の emacsclient ページがすべてなのですが、snapshot (emacs23) 向けならばこうするようにと書いているとおり、次のような感じのスクリプトをこしらえておきます。

#!/bin/sh

emacs='emacs-snapshot'
emacsclient='emacsclient.emacs-snapshot'
tempuid=`id -u`

if [ ! -e "/tmp/emacs$tempuid/server" ]
then
    $emacs &
    while [ ! -e "/tmp/emacs$tempuid/server" ] ; do sleep 1 ; done
fi

$emacsclient "$@"

あとは全ての emacs 起動 (コマンドライン、ランチャ等) はこのスクリプトを使って行うようにすればOKです。

一方 .emacs には emacsclient からの情報が受け取れるよう、次のような設定を準備しときます。先頭の方で書いておけばよいです。

(server-start)

なお、Elscreenを使っている環境であれば、次のような設定をあわせて書いておくことで emascclient で指定したファイルが新しい window でオープンされるようになります。

(require 'elscreen-server)

php.ini における xdebug の有効化について

xdebug を使ったリモートデバッギングを行うためにいろんなクライアントで試すものの、なんか全然うまいこといかないなあと思っていたら、なんてことはない、php.ini の xdebug のエントリがまずかったという。

拡張機能を有効化するために、他の PHP モジュールと同じように

extension=xdebug.so

と書くのではなくて、

zend_extension=/usr/lib/php5/20060613/xdebug.so

と言う風に zend_extension で有効化しないといけなかったという。

Compiz Config Settings Manager

Compiz Fusion の設定を行う Compiz Config Settings Managerを入れておくと色々よろくできるようになる。

sudo apt-get install compizconfig-settings-manager

Wobbly Windows

外観の視覚効果を「追加効果」にするとあわせて有効化される、あのウィンドウがゆらゆらと蠢くやつが地味に鬱陶しいので、エフェクトの項で無効化しておく。

シフトスイッチャー

ウィンドウ・マネジメントのシフトスイッチャーを有効化し、「次のウィンドウ」「前のウィンドウ」をSuper(WindowsKey)-Tab, Super-Shift-Tabあたりにしておく。
便利なんだけども、通常のAlt-Tabと比べるとちょっと重いのであんまりよろしくない。

Scale

同じくウィンドウ・マネジメントから有効化し、キーボード向けの設定を追加する。Ctrl-Shift-aあたりにした。
便利で軽いんだけども、こちらはマウスで対象ウィンドウを示してあげないといけないのがネック。この手の操作はやはり左手オンリーでさくっとスイッチできるとうれしいんだけどなあ。

個人的なキーボードセットアップ

導入後最初はやはりこの辺をやっとかないとペースが上がらないということで。

SCIM

SCIM開始にいくつか登録されている分を削除して、「Zenkaku_Hankaku,Control+backslash」くらいにする。

Emacsキーバインド

gconf-editor

で、

Emacsに変更する。

大抵の箇所はEmacsバインドになるものの、微妙に足りない感じがする。C-o とか。

キーボード設定

「システム」→「キーボード」でキーボード設定を立ち上げて、レイアウトタブを開いて、レイアウトオプションで以下のことを行う。

Alt/Windowsキーの挙動

Alt and meta are on the Alt keys.

Ctrlキーの位置

CtrlとCapseLockキーを入れ替える

Layout switching

すべてチェックなし状態にする。 (Emacs対策)

キーの入れ替え

その他、上記キーボード設定では行えないキーの入れ替えは Xmodmap を使って行う。

ホームに.Xmodmapファイルを作成。以下はEscと半角/全角の入れ替えと、変換無変換をAltキーにしてしまうという設定。

keycode 9   = Zenkaku_Hankaku
keycode 49  = Escape
keycode 129 = Alt_L Meta_L
keycode 131 = Alt_L Meta_L

で、xmodmapを実行。

xmodmap ~/.Xmodmap

ちなみにキーコードの調べ方は、ターミナルからxevを立ち上げて調べることができる。

ThinkPad データリフレッシュ

いよいよOSの動きのもたつきが気になり始めたので、データのバックアップを取った後のデータリフレッシュ。

で、せっかくなのでこれまで開発向け OS として XP 上の仮想マシン OS という形であわせて利用していた Ubuntu も、今回はデュアルブート体制で導入することに。
でもそのまま投入するということではなく、へたれに Wubi で。便利な世の中になったねえ。