gitを触ってみる(ファイルの移動と改名の扱われ方)

gitを触ってみました。要件としては以下の通りです。

  • UTF-8のファイル名を扱う
  • EUC-JPのファイル名を扱う
  • mvしたファイルはmvとして扱う
  • renameしたファイルはrenameとして扱う

まずgit config。UTF-8のファイル名を扱うものとして設定してみます。
MacOSX上でUTF-8の設定をしてgit add .してみました。

git config --global user.name "nawolets"
git config --global i18n.commitencoding UTF-8
git config --global i18n.logoutputencoding UTF-8

ところがgit statusを見たところ、ファイル名が\344などとなってしまいます。UTF-8として扱われてはいるようですが...。とりあえずgoー。

gaulm:test nawolets$ du -ah
 52M     ./むにゅう.zip
 52M     .
gaulm:test nawolets$ git init
Initialized empty Git repository in /Volumes/MacVolume2/nfsexports/Trapezium-ed/test/.git/
gaulm:test nawolets$ git add .
gaulm:test nawolets$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#     new file:   "\343\202\200\343\201\253\343\202\205\343\201\206.zip"
#
gaulm:test nawolets$ git commit -m "むにゅう追加"
[master (root-commit) 842be0f] むにゅう追加
 1 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 "\343\202\200\343\201\253\343\202\205\343\201\206.zip"
gaulm:test nawolets$ du -ah
  0B     ./.git/branches
<略>
 51M     ./.git/objects/b2/aa646d0ff3af4c53e8c98bfdc6a05326ed87a4
<略>
 52M     ./むにゅう.zip
102M     .
gaulm:test nawolets$ 

できました。つぎ、改名してみます。

gaulm:test nawolets$ git mv むにゅう.zip うにゅう.zip
gaulm:test nawolets$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#     renamed:    "\343\202\200\343\201\253\343\202\205\343\201\206.zip" -> "\343\201\206\343\201\253\343\202\205\343\201\206.zip"
#
gaulm:test nawolets$ git commit -m "うにゅうに改名"
[master a95df47] うにゅうに改名
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename "\343\202\200\343\201\253\343\202\205\343\201\206.zip" => "\343\201\206\343\201\253\343\202\205\343\201\206.zip" (100%)
gaulm:test nawolets$ du -ah
  0B     ./.git/branches
<略>
 51M     ./.git/objects/b2/aa646d0ff3af4c53e8c98bfdc6a05326ed87a4
<略>
 52M     ./うにゅう.zip
102M     .
gaulm:test nawolets$ 

おおっ。どうやらリポジトリ上でもRemove&CreateではなくRename(Move)として扱われているみたいです。
あとは日本語名。うにゅうを削除してcheckoutしてみます。

gaulm:test nawolets$ rm うにゅう.zip
gaulm:test nawolets$ git checkout うにゅう.zip
gaulm:test nawolets$ ls
うにゅう.zip
gaulm:test nawolets$ 

素晴らしい。ところでgit statusなどで日本語がうまく表示されないのはさてどうしたものか...。→調べたら書いてありました。
git config --global core.quotepath falseを使うのですね。

gaulm:test nawolets$ git mv うにゅう.zip むにゅう.zip
gaulm:test nawolets$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#     renamed:    "\343\201\206\343\201\253\343\202\205\343\201\206.zip" -> "\343\202\200\343\201\253\343\202\205\343\201\206.zip"
#
gaulm:test nawolets$ git config --global core.quotepath false
gaulm:test nawolets$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#     renamed:    うにゅう.zip -> むにゅう.zip
#
gaulm:test nawolets$