2012年7月20日

Vim で書く Git のコミットメッセージが文字化けする

Git のコミットメッセージに日本語を含める文字化けするお話.

まぁ,英語使えよって話ですが,私は英語が苦手なのです.
なので,すごく簡単な英語で [git show] 見ればわかるような説明を書くくらいなら,日本語で幾分かしっかり書いてあった方がいいんじゃない?って事で.

普通にやる

# なんか変更してコミット
$ edit homura.txt
...
$ git commit -a

(Vimが立ち上がって,日本語のコミットメッセージを記録)

$ git log

commit ...

    B9)2JBg%1!<%?%$$K%O!<%I%&%'%";EMM$rDI5-!%

(めっちゃ文字化けしとる・・・)
何も読めませんね.

ちなみに私は Cygwin の Mintty を "UTF-8" で使用しているので, [git commit] コマンドに直接コミットメッセージを含めれば文字化けしません.
# 直接コミットメッセージを含める
$ git commit -am " てきとーに編集しちゃったよ ウフフ☆おっけー♪ "

$ git log

commit ...

    てきとーに編集しちゃったよ ウフフ☆おっけー♪

(普通に読める)
これは,ターミナルの文字コードが "UTF-8" となっているからです.

環境変数を設定する

そんなわけで,Vim の保存形式を "UTF-8" に変更してしまえば良いわけです.

しかし,現状の [.vimrc] は "Shift-JIS" を考慮した作りになっていて,[.vimrc] そのものを "UTF-8" オンリーに作り変えるのはちょっと・・・って人はいると思います.
特に Cygwin 使ってる人には多いんじゃないかな.

なので,私は [git commit] コマンドで立ち上がる Vim に引数としてオプションを渡す事で [git commit] の時は "UTF-8" で保存するようにしています.
# Git の環境変数を編集
$ git config --global core.editor 'vim -c "set fenc=utf-8"'
これで Vim がコミットメッセージを保存する際に,"UTF-8" で保存しようとするはずです.


それでは,またの機会に. とぅっとぅる~

2012年7月8日

SSH を用いてパスワードなしで GIT リポジトリにアクセスする

備忘録とか言いながら何にも書いてなかったので,ちょくちょく書いていきたいね.

パスワード入力なしで GIT にアクセスする

Gitを使って開発してると,push や pull の度にパスワード入力するのめんどいよね.
そこで,公開鍵認証を使ってパスワード入力なし,かつ安全にリポジトリにアクセスする方法.

今まで

今までは HTTP を使って,
# リポジトリをクローン
$ git clone https://git.saku-lab.net/git/homura.git

# 編集作業とコミット
$ vim madoka.html
...
$ git add .
$ git commit -am " てきとーに編集しちゃったよ ウフフ☆おっけー♪ "

# 競合を確認し,変更をプッシュ
$ git pull
Already up-to-date.

$ git push
(ユーザ名とパスワードを入力)
とかやってて,非常にめんどくさい.

前提条件

  • SSHでGITサーバにログインできる
  • GITサーバは Linux とする
    • テスト環境は CentOS ですが,他のディストリビューションでも変わりません
  • GITサーバで管理者権限にスイッチできる
  • SSHの鍵ペアを生成できる環境
    • Windows : cygwin など
    • Mac, Linux : デフォルトでインストール済み
  • コマンドラインでは,以下の内容を自身の環境で適度に置き換える
    • GITサーバのホスト名は「 git.saku-lab.net 」とする
    • GITサーバへアクセスするユーザ名は「 sakura 」とする
  • プロンプトは以下を意味する
    • c$ : クライアントでの操作
    • s$ : サーバでの操作
    • [cs]$ は一般ユーザを示す
    • [cs]% は特権ユーザを示す

やりかた

鍵ペアの作成・サーバへの登録

まずは,サーバにログインする為の鍵ペアを生成する.
そして,生成された公開鍵をサーバに登録する事で,パスワード認証なしでサーバにログインできるようにする.
# SSHの鍵ペアを生成する
c$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sakura/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
Your identification has been saved in /home/sakura/.ssh/id_rsa.
Your public key has been saved in /home/sakura/.ssh/id_rsa.pub.
...

# サーバに公開鍵鍵を転送し,登録する
c$ scp ~/.ssh/id_rsa.pub sakura@git.saku-lab.net:/home/sakura
(パスワードを入力)

c$ ssh sakura@git.saku-lab.net
sakura@git.saku-lab.net's password:
(パスワードを入力)

s$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys && rm ~/id_rsa.pub
s$ exit

# 秘密鍵でのログインを確認する
c$ ssh sakura@git.saku-lab.net -i ~/.ssh/id_rsa

s$ ■
これで秘密鍵を使ってパスワード認証なしで,サーバにログインできるようになったはず.

公開鍵暗号方式については,興味があったら「PKI」や「RSA」ってキーワードでてきとーにググるとよくわかると思います.

SSHコンフィグの編集

SSHコンフィグを編集し,接続先や秘密鍵を予め設定しておく.
# SSHコンフィグの編集
c$ vim ~/.ssh/config (なければ,新規作成)

Host GITREPO
   HostName         git.saku-lab.net
   IdentityFile     ~/.ssh/id_rsa
   User             sakura

(上記を自分の環境に置き換えて編集して保存)

# SSHコンフィグの反映を確認
c$ ssh GITREPO

s$ ■
これでコンフィグ内の [Host] を指定するだけで,SSHでアクセスする際にコンフィグの内容を適用してくれます.

SSHでGITリポジトリにアクセス!

では,Gitリポジトリへのアクセスに SSH を使用してみます.
# コマンド構文
c$ git clone ssh://[Host名]/[リポジトリまでの絶対パス]/[リポジトリ名].git

# SSHでクローンする
c$ git clone ssh://GITREPO/var/gitrepo/homura.git

※ サーバの [/var/gitrepo] にリポジトリが存在している場合
あとは,普通に作業するだけ.
クローンした際にリポジトリの [.git/config] に接続先 (origin) などが記録される為 クローン以降の pull, push は自動的に秘密鍵を使ってアクセスしてくれるわけです.

すでにSSHでアクセスできる環境がある場合は,すごく簡単ですね.これで色々と捗ります.

パーミッションについて

一つ注意として,上記の方法でアクセスした場合,当然アクセスするユーザは秘密鍵で認証されたユーザとなります.
つまり,Gitリポジトリにそのユーザの読み取り権限がなければ git clone, pull が,書き込み権限がなければ git push が出来ません.

一番楽なのは,Gitリポジトリのパーミッションをフルアクセスにしてしまう事ですが,セキュリティ上好ましくはありません.
なので,アクセスさせたいユーザをGitの管理ユーザと同じグループに所属させ,グループへのパーミッションを変更するとアクセス出来るようになります.
# 特権ユーザとなり,ユーザをグループに追加
s$ su

s% vigr (viが立ち上がる)

root:x:0:
...
git-user:x:33:gitman,sakura    # ← ユーザ追加(複数の場合はカンマで区切る)
...

※ Gitリポジトリのグループが [git-user] の場合

# パーミッションを変更
s% chmod -R 770 /var/gitrepo
グループは複数追加出来るので,上手く使えば特定のリポジトリへのアクセス制御にも使えます.

なお,グループの定義ファイルは [/etc/group] なので,それを直接編集しても大丈夫です.
しかし,そうすると定義ファイルの再読み込みが必要になるので,[vigr]コマンドを使った方が楽だと思います.
([vigr]コマンドは終了時に[/etc/group]を再読み込みしてくれる)

ファイアウォール

上記の方法で [ssh://] として,SSHプロトコルを使用した場合は標準でtcp/22 が使用されます.
なので,普通に tcp/22 のポートを開ければアクセスが可能です.

ちなみに,GITプロトコルはデフォルトでtcp/9418, HTTPはtcp/80,HTTPSは tcp/443を使用します.

また,セキュリティ上の理由で SSH のポートを変更している場合は,SSHコンフィグにポート番号を指定する事でアクセスが可能です.
# SSHコンフィグの編集
c$ vim ~/.ssh/config

Host GITREPO
   HostName         git.saku-lab.net
   Port             12345              # ← ポート番号を指定
   IdentityFile     ~/.ssh/id_rsa
   User             sakura

(上記を自分の環境に置き換えて編集して保存)
また,今回の作業で使用ユーザの公開鍵が登録されたはずなので,サーバ側の [/etc/ssh/sshd_config] の設定でパスワードによるログインを禁止しておく事を強くオススメします.

ローカル環境だけなら良いですが,外にSSHを開いていると1日大体5回くらいは知らないところから接続要求が来ます.
(デフォルトポートなら尚更です.)
もし,これでパスワードログインが破られれば,不正にサーバにログインされます.
# SSHの設定を編集
s% vim /etc/ssh/sshd_config
...
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no            # ← yes を no に変更する
...

:wq (保存する)

# SSH のサービスを再起動する
s% service sshd restart
これでパスワードによるログインが禁止になりました.
公開鍵を指定せずにアクセスを試みると,アクセスが拒否されます.


それでは,またお会いしましょう. とぅっとぅる~