Gitってpushするの忘れない? まあ、結局何を使っても忘れるものは忘れるんだけどね。
Gitってpushするの忘れない? まあ、結局何を使っても忘れるものは忘れるんだけどね。
むむ、部分的にstageしようとしたらtrailing whitespaceがどうとかでパッチが適用できないと言われた。gitに渡る標準入力の行末コードとファイルの行末コードが一致しないのだろう。
この前の設定を次のように修正したらうまくいった。
-(modify-coding-system-alist 'process "git" '(utf-8 . utf-8)) +(modify-coding-system-alist 'process "git" '(utf-8-dos . utf-8-unix)) - (defun add-sh-utf8-process-coding-system-alist () - (cons (cons shell-file-name '(utf-8 . utf-8)) process-coding-system-alist)) + (defun add-sh-utf8-process-coding-system-alist () + (cons (cons shell-file-name '(utf-8-dos . utf-8-unix)) process-coding-system-alist))
もっと健康にならなければならないと思う。どうも三月の惨状以来、体の活性が上がりにくくなった気がする。
もっと体を動かしたいのだが、平日はなかなかできない。いや、やろうと思えばできるのだが、平日は仕事に集中する日、という制限を取り払いたくはない。結局できるのは行き帰りの自転車通勤くらいのものだ。
なんとかまともに使えそうな設定が見つかったのでメモ。
条件:
以上を考慮すると、Meadow-git間はutf-8にするのが無難。
cp932にしていろいろ試してみたのだけれど、git logのformatで%sを使った場合にlogOutputEncodingを考慮してくれない(gitにログをcp932で出力させられない)というところでギブアップ。magit-insert-unpushed-commitsなどがこのフォーマット指定を使っている。
utf-8にすると、今度はsh経由でgitを呼び出す部分で困る。sh経由でほかのツールを呼び出すこともあるので、shのエンコーディングを一律utf-8にするわけにはいかない。仕方ないので、defadviceでごにょごにょした。
msysgitの中で無効化するファイル。Cygwinのを使うので、削除するなり移動するなり。
.bashrcの関係ありそうな部分。
export TMP=/tmp export TEMP=/tmp export LANG=ja_JP.CP932
.emacsの関係ありそうな部分。
; *環境変数の設定。これらをシステム全体の設定にするのは抵抗があるのでここで。 ; Cygwin1.7の動作とか、win-ssh-askpassの動作とかで問題になったものを列挙。 (setenv "LANG" "ja_JP.CP932") (setenv "TMP" "c:/app/cygwin/tmp") ;Meadowを使っている間はCygwinの/tmpを使う。 (setenv "TEMP" "c:/app/cygwin/tmp") ;Meadowを使っている間はCygwinの/tmpを使う。 ; *とりあえず日本語環境が前提。 (set-language-environment "Japanese") ; *magit.elはgitを直接起動することもあるし、shell-file-nameのコマンド経由で起動することもあるので注意。 (setq shell-file-name "sh") (setq shell-command-switch "-c") ; *私はMeadow-Cygwin間は基本的にcp932にしている。 ; ほとんどの自作コマンドラインツールがcp932前提だし、 ; 日本語版Windowsのデフォルトのロケールはcp932なわけだから、 ; Cygwin以外のWindows用ツールと連携させるならば普通はこの方がいい。 (modify-coding-system-alist 'process "sh" '(cp932-dos . cp932-unix)) ; *Meadowとgitとの間はutf-8にする。 ; コミットログをutf-8で記録したい。 ; i18n.commitEncodingはコミット時に変換してくれるわけではないっぽい。 ; また、magit.el内でgit log --format %sを使っている場所があるので、 ; どうしてもutf-8でやりとりせざるを得ない。 ; この設定はshell-file-name経由でgitを呼ぶ場合には適用されないので注意。 ; そちらは.gitconfigのi18n.logOutputEncodingと、sh.exeに対する ; process-coding-system-alistの設定で調整すること。 (modify-coding-system-alist 'process "git" '(utf-8-dos . utf-8-unix)) ; magitを使えるようにする。 (cond ((locate-library "magit") (require 'magit) ;; magitがshell-file-name(sh.exe)経由でgitを呼ぶとき、utf-8で入出力する。 ;; magitがshell-file-nameを使ってprocess-fileやcall-processする関数には次のものがある。 ;; - magit-shell-command-to-string ;; - magit-git-exit-code ;; - magit-run-shell ;; これらの呼び出し時、一時的にprocess-coding-system-alistを書き換える。 (defun add-sh-utf8-process-coding-system-alist () (cons (cons shell-file-name '(utf-8-dos . utf-8-unix)) process-coding-system-alist)) (defadvice magit-shell-command-to-string (around magit-shell-command-to-string-proc-coding activate) (let ((process-coding-system-alist (add-sh-utf8-process-coding-system-alist))) ad-do-it)) (defadvice magit-git-exit-code (around magit-git-exit-code-proc-coding activate) (let ((process-coding-system-alist (add-sh-utf8-process-coding-system-alist))) ad-do-it)) (defadvice magit-run-shell (around magit-run-shell-proc-coding activate) (let ((process-coding-system-alist (add-sh-utf8-process-coding-system-alist))) ad-do-it)) ))
.gitconfig
[diff] external = ~/git-diff-nkf.sh #[i18n] # logOutputEncoding = utf-8
~/git-diff-nkf.sh (異なる文字エンコーディングで書かれたファイルの差分をUTF-8に統一するために必要。echoの部分はちょっと怪しい。モード値だけが変わった場合にどうなるのかとかよくわかっていない)
#!/bin/sh # $1 = 比較しているファイルのファイル名 # $2 = 旧バージョンの内容が入ったテンポラリファイル名 # $3 = 旧バージョンの内容のオブジェクト名 # $4 = 旧バージョンのファイルのモード値 # $5 = 新バージョンの内容が入ったテンポラリファイル名 # $6 = 新バージョンの内容のオブジェクト名 # $7 = 新バージョンのファイルのモード値 echo diff --git a/$1 b/$1 if test $3 == "." then # *新しくファイルを追加するとき。 # 例: # diff --git a/.gitignore b/.gitignore # new file mode 100644 # index 0000000..b25c15b # --- /dev/null # +++ b/.gitignore echo new file mode $7 echo index 0000000..${6:0:7} diff -u -L /dev/null -L b/$1 $2 $5 | nkf --utf8 -d else # *内容が変わった場合。 # 例: # diff --git a/readme.txt b/readme.txt # index 353a8aa..401f140 100644 # --- a/readme.txt # +++ b/readme.txt echo index ${3:0:7}..${6:0:7} $7 diff -u -L a/$1 -L b/$1 $2 $5 | nkf --utf8 -d fi
2010-04-24追記:上の方法は選択範囲(日本語を含む)を部分的にstageする機能が正しく動かない場合がある。それに対処するためエンコーディング調整ラッパーを使う方法を書いた。これを使うと.gitconfigとgit-diff-nkf.shは不要。
先月はSteamBirdsをずーっとやってたなぁ。こういう司令官ごっこ的なぬるいシミュレーションは好き。
なんか今日はお腹が痛かったり熱っぽかったり喉が痛かったりして具合が悪かった。
今はほめられ不況なのでほめられインフレを恐れずにもっとほめましょう。
とりあえずGitの本を買ってきた。もう少し勉強しますかね。
プロジェクト内に2つのファイルがあって、一方はSJIS、もう一方はUTF-8で書かれている。両方修正してMagit上で差分を見ると、当然のように一方が文字化け。やれやれ。コミットログに関してはi18n.commitencodingだとかi18n.logoutputencodingだとか、それっぽいものが用意されているようだが(ちゃんと働くのか確認してないけど)、肝心のファイルの中身はどうすればいいのか分からなかった。
でも、diff.external(GIT_EXTERNAL_DIFF)でdiffを置き換えられると知って、nkfで変換することを思いついた。
.gitconfigに以下を追加。
[diff] external = ~/gitdiff.sh
gitdiff.shは以下のような感じ。自分はMeadowとgitの間は(今のところ)sjisにしているので–sjis。改行コードがLFになるように-d。
#!/bin/sh echo diff --git a/$1 b/$5 echo index $3 $4 diff -u -L a/$1 -L b/$5 $2 $5 | nkf --sjis -d
echoの部分はMagitが認識できるように、できるだけgit標準の出力に近づけた。magit.el内には(looking-at "^diff –git ./\(.*\) ./\(.*\)(")という記述の下に(looking-at "^diff --cc +\(.*\))")という記述もあるのだけど、こっちはどういう状況での出力なのか分からないのでスルー。
なんかもう、Subversionでいいんじゃないかという気がしてくるのだが……。
ジュエルペットてぃんくるのOPってどこかで聞いたような曲なんだけど、何だろう。