Git
Gitのちょっと便利な使い方
kaoruです。
今回は、GitのちょっとしたTipsをご紹介したいと思います。
Gitというのは、近年、Subversionに代わって普及が進んできたバージョン管理システムです。
特徴として、Subversionに比べて高速である点と、マージの管理が簡単である点が挙げられます。
規模の大きな開発や、複数人での開発を行っていると、たくさんのブランチが発生して、ブランチ間の関係をビジュアルに確認したくなることが頻繁にあります。
TortoiseGitやQGitなどのGUIツールを使うとブランチ間の関係をビジュアルに表示することができます。
しかし、普段コマンドラインで作業している場合、わざわざ別のツールを使うのではなくコマンドラインで直接確認できた方が便利なのではないでしょうか。
実は、git logコマンドにはオプションとして、--graphがあり、標準でもツリー表示ができます。しかし、そのままでは、表示される情報が多すぎて、TortoiseGitのような一覧性がよくありません。
そこで、オプションを工夫してコマンドラインでもビジュアルにブランチ間のツリー構造がビジュアルに確認できるようにしてみました。
git log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
これを毎回、入力するのはいささか大変ですので、エイリアス機能を使っています。
以下のような設定を $HOME/.gitconfig か、/etc/gitconfig に追加します。
[alias]
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
このような設定をしておけば、
git graphと入力するだけで、表示可能です。
この表示ができると、日々の作業がとても便利になります。
Gitをお使いの方は、是非一度お試しください。
続きを読む "Gitのちょっと便利な使い方" »
SubversionからGitへ移行しようとして日本語ファイル名(UTF8)に困ったことある方に
みなさん、こんにちは
kaoruです。
前回に引き続き、Gitに絡んだお話です。
今までSubversionを使っていたけど、そろそろGitに移行しようと考えておられる方も多いのではないでしょうか。
Gitのパッケージの中にgit-svnというモジュールがあるため、SubversionからGitへは比較的容易に移行できます。また、GitからSubversionレポジトリへのコミットも可能なため、一時的に相互運用することも可能になっています。
しかし、ここに大きな落とし穴がありSubversionレポジトリーにドキュメントファイルなど、ファイル名が日本語のファイルがあると文字化けしたりエラーになったりしてうまくいかないのです。
少なくとも以前はそういう状態でした。
しかし、今ではCygwin版Gitを使うという選択肢があります。後ほど、実際にコマンドを実行しながら、日本語のファイル名が文字化けせずに扱えることをご紹介します。
まずは、技術的背景と以前はどのような問題が発生していたかを説明します。
Subversionは内部的にファイル名をUTF8で扱います。
(こちら参照:http://www.open.collab.net/scdocs/SVNEncoding.html.ja)
Git は内部的にファイル名をバイナリ文字列として扱い文字エンコーディングを関知しません。
(こちらのDiscussion参照:http://www.kernel.org/pub/software/scm/git/docs/v1.7.2.1/git-log.html) すなわち、日本語版WindowsではShift_JISになっていました。
Subversionにコミットしたファイルをgit-svnを使って、Git管理に移行すると、ファイル名の文字エンコーディングはUTF8のまま変換しようとしますが、日本語版WindowsではShift_JISでないといけなかったため、問題が発生しました。

しかし、日本語版Windowsでも最新版のCygwinを使えばファイル名をUTF8として扱うことが出来ます。つまり、Cygwin上で動くGitとSubversionは同じUTF8の文字エンコーディングを利用できます。

以下に、実際に試してみた手順を 紹介します。
まず、 Cygwin の最新版と、 Cygwin 版の Git をインストールしました。
バージョン表示は以下のようになります。
kaoru@ALIEN% uname -a
CYGWIN_NT-6.1-WOW64 ALIEN 1.7.6(0.230/5/3) 2010-08-16 16:06 i686 Cygwinkaoru@ALIEN% git --version
git version 1.7.1
影響があるかどうかはわかりませんが、環境変数 LANG は、 UTF8 に設定しました。
kaoru@ALIEN% echo $LANG
en_US.utf8
また、 Cygwin に接続する際には putty を利用し、 putty の文字コードの設定は、UTF8 に設定しました。
次に、 git svn clone コマンドで日本語ファイル名を含む Subversion レポジトリーをクローンして Git レポジトリーとしました。

ls -al コマンドで確認しましたが、日本語のファイル名が正しく再現されていることが確認できました。

エクスプローラー上からも文字化けせず日本語ファイル名が利用できました。

次にファイルを変更後、 git status を実行すると、日本語ファイル名がエスケープされて表示されました。

これは少し不便ですので、エスケープしないように設定してみます。
git config --bool core.quotepath false
これで、ちゃんとファイル名が読めるように表示されました。

次に、 git commit で日本語のコミットメッセージを入力してファイルをコミットし、
git log で確認しましたが、正常に表示されました。

最後に、今までの変更を、 Subversion に反映させるために、 git svn dcommit を実行したのですが、筆者の環境ではトラブルが発生し、 unable to remap ... といったエラーメッセージが表示されました。
![]()
最初は驚くかもしれませんが、このようなエラーが表示された場合解決策がありますので心配ありません。
まず、 Cygwin から起動したすべてのプロセスを終了させ、通常のコマンドプロンプトから、
cd C:\cygwin
bin\ash.exe
/bin/rebaseall
とコマンドを実行すればOKです。

作業を再開しましょう。
git svn dcommit コマンドで、 Git レポジトリーの変更を、 Subversion レポジトリに反映し、 svn log -v コマンドで、 Subversion レポジトリのログを確認したところ、日本語のコミットログ、日本語のファイル名のいずれも正しく反映されていることがわかりました。

以上のような手順により、Cygwin版Gitを利用すれば、Gitで日本語ファイル名を扱うことができ、git-svnを利用することで、Subversionとの連携も可能になることがわかりました。
今まで、日本語のファイル名が原因でSubversionからGitへの移行を躊躇っていたレポジトリについても道が開けたのではないかと思います。
本来Cygwinを使わずに対応したいところなので、もっとスマートな方法を模索中です。より良い方法がありましたら、またご紹介させていただきます。
Gitレポジトリのスペースや改行を統一するには
みなさん、こんにちは
kaoruです。
今回は、Gitレポジトリで管理しているソースコードのスペースや改行など体裁を統一する方法です。文字コードの一括変更やリファクタリングなど色々応用ができると思います。
フィルタースクリプトの準備
まず、ソースコードをきれいに書き換えるフィルタースクリプトを用意します。フィルタースクリプトは標準入力からテキストを入力して、加工した後、標準出力から出力するようなものなら何でもOKです。
以下は例です。この例では、TABを半角スペース4つに置換し、行末のスペースを取り除きます。また、改行コードをLFにします。ファイルの末尾が必ず改行コードLFで終わるようにしています。
#!/usr/bin/perl
use Text::Tabs;
$tabstop = 4;
while (<>) {
$_ = expand($_);
s/[ \r\n]+$//;
print "$_\n";
}
コミット時に自動的にフィルターを適用
改行コードや不要なスペースは気をつけていても、ついうっかりコミットしてしまうものです。EclipseやVisual StudioなどIDEを利用していると、暗黙的に不要なスペースが挿入されてしまうこともあります。そこで、コミット時に自動的にフィルターを適用して体裁を整える方法をご紹介します。
まず、フィルターをGitに登録します。/etc/gitconfigや$HOME/.gitconfigなどに以下の設定を追加します。
[filter "normalize-text"]
clean = /usr/local/bin/normalize-text.pl
smudge = cat
次にファイルとフィルターを関連づけます。ワーキングツリーに.gitattributesというファイルを作成し、コミットしてください。
*.php eol=lf filter=normalize-text
このような設定を行うことで、以降コミットするファイルにはすべてフィルターが適用されるようになります。
過去の履歴の書き換え
フィルターを指定するだけでは、今後コミットする変更に対しては体裁を統一できますが、すでにコミットしてしまった変更に対しては効果がありません。さらに、ある時点で急に体裁を変更してしまうと前後でdiffによる比較やマージが出来ないといった問題が発生します。そこで、過去の履歴に対してもフィルターを適用する方法をご紹介します。
次にワーキングディレクトリーの中のすべてのファイルを書き換えるスクリプトを用意します。
以下は例です。拡張子が.phpであるファイルを抽出してフィルターを適用しています。[1]
#!/bin/bash
for f in $(find -name \*.php)
do
mv $f $f.bak
cat $f.bak | /usr/local/bin/normalize-text.pl > $f
rm $f.bak
done
それから、作業を行うために、Gitレポジトリーをクローンします。
git clone EXAMPLE.COM:/repos/my_project.git
チェックアウトされたワーキングツリーにカレントディレクトリーを移動します。
cd my_project
ワーキングツリーの中でgit filter-branchを使って履歴を書き換えます。
git filter-branch --tree-filter '/home/kaoru/rewrite_history.sh' HEAD
おわりに
GitはSubversionと違って履歴の編集ができるため、最初はあまりコーディング規則などを設けずに開発を始めて、ある程度出来上がってきてから、過去に遡って、ソースコードを掃除するというようなことができます。
最初から完璧を目指すと敷居が高くなってしまいますが、Gitなら気軽にコミットが出来ます。
今回のような履歴を書き換えるテクニックは公開レポジトリでは厳しいものがありますので、公開レポジトリにpushする前に、一度履歴を見直してみることをお勧めします。
Git-Redmine: GitのコミットとRedmineを連携する。チケット駆動開発にも。
おひさしぶりです。
kaoruです。
今回は、日常のGitの利用シーンでRedmineと連携できるGit-Redmineという小さなツールを作ってみたのでご紹介します。
(ツールは後ろのリンクからダウンロードできるので、ぜひお試しください。)
作業管理にRedmine、ソースコードの管理にGitを使っているプロジェクトは最近増えてきていると思います。
Redmineのチケットを見て作業内容を確認、該当するソースコードを修正、最後にGitでコミットしますよね。
Gitでコミットする時には、コミットメッセージというのを書きます。ここには、作業内容や変更点を簡単に記録します。
でも、Redmineを使って作業管理をしているプロジェクトでは、作業内容や変更点はRedmineのチケットの内容と基本的に同じですよね。
だからコミットメッセージを入力するとき、いままで、ウインドウを2つ並べて、Redmineからコミットメッセージの入力欄へのコピペを繰り返し・・・、チケットの番号を書き加えて・・・、とういうことをしていませんでしたか?
これだと、毎回、単純な作業にうんざりだし、コピペミスも怖い。
しかも、コミットメッセージが書くのが面倒で、ついつい2,3文字で済ませちゃった経験ありませんか?

面倒くさいことはツールで解決!
Git-Redmineを使うと、こんな問題を解決できます。
コミット時に作業の流れでチケットを確認できるので、巷で流行りのチケット駆動開発にもぴったりです。
できること
コマンドラインから、Redmineに登録されているチケットを確認できます。
Gitコミット時に、Redmineのチケットのタイトルをコミットメッセージに利用できます。
このツールは、Redmineが用意しているREST APIを利用しています。また、ソースコードをカスタマイズしやすいようにPythonで書いています。
インストール方法
1. 本ツール(Git-Redmine)のソースファイルを取得します。
(例)
$ git clone git://github.com/coiled-coil/git-redmine.git
2. git-redmineというファイルを実行パスの通った場所にコピーします。
(例)
$ cd git-redmine
$ mkdir -p $HOME/bin
$ cp src/git-redmine $HOME/bin/
git-redmineファイルの1行目にpythonのパスが書かれています。
/usr/bin/python以外を利用する場合はパスを書き換えてください。
Python 2.6 以降が必要です。CentOS5では、/usr/bin/python26 などに書き換えてください。
3. RedmineのAPIキーを設定します
APIキーは、Redmineログイン後に、個人設定の中に表示されます。(下の赤線部分)

もし、表示されない場合はREST API機能がオフになっている可能性がありますので、
管理者にお問い合わせください。また、古いRedmineでは利用できない可能性があります。
(例)
$ git config --global redmine.apiKey xxxxxxxxxxxxxxxxxxxxxxxxxxx
4. プロジェクトのGitレポジトリに、プロジェクトのRedmineのURLを設定します。
(例)
$ cd /repos/YOUR-PROJECT
$ git config redmine.projectUrl http://SAMPLE.COM/repos/YOUR-PROJECT
使い方
1. チケットの一覧を表示する。
$ git redmine
2. あるチケットの詳細を表示する。
$ git redmine 1234
3. あるチケットの情報を利用して、コミットを行う。
$ git redmine commit 1234
4. あるチケットの情報を利用して、コミットを行う。同時にチケットの達成率を90%に更新する。
$ git redmine commit 1234 --done-ratio=90
5. あるチケットの情報を利用して、コミットを行う。同時にチケットの達成率を100%、ステータスを解決済みに更新する。
$ git redmine commit 1234 --done-ratio=100 --status=3
ソースコード
こちらにソースコードを置いています。
https://github.com/coiled-coil/git-redmine






