gitを触ってみる(ファイル移動時のデータ転送)

git管理下でファイル移動(git mv)を行った際、リポジトリ内でも同一のファイルとして扱われている(コピーを生成しない)ことがわかりました。実際はgit rmされたファイルが移動(改名)後に再びgit addされているようです。ファイルの同一性を認識できるのはすごいですね。
今回は、ファイル移動を行った際のリポジトリ内での変更操作について実験してみます。git mvを行った場合、一度rmされてaddされているわけですが、このaddされるポイントで新規にリポジトリへのファイル追加が行われるのか、それともrmされたリポジトリ内のオブジェクトファイルを再利用するのかというところです。
リポジトリ内でのリビジョン管理が途切れないらしいことを考えると、再利用されているものと予想するわけですが。
さて、例によってtestディレクトリに50MBほどのzipファイルをぶちこんでgit init, git add .&git commitを試みてみました。du -ahはこんな感じです。

gaulm:test nawolets$ du -ah
<略>
 47M     ./.git/objects/48/e18a8c202ac232aa91a20619c3376b647fa467
<略>
 48M     ./ふにゅう.zip
 95M     .
gaulm:test nawolets$

47MBのファイルがリポジトリ内での実体っぽいです。inodeを出してみます。

gaulm:test nawolets$ ls -il .git/objects/48/e18a8c202ac232aa91a20619c3376b647fa467
108381 -r--r--r--+ 1 nawolets  staff  49222381  9 15 08:44 .git/objects/48/e18a8c202ac232aa91a20619c3376b647fa467

108381。ではgit mvしてcommitしてみます。

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:    ふにゅう.zip -> うにゅう.zip
#
gaulm:test nawolets$ git commit -m "うにゅうに改名"
[master 4487d05] うにゅうに改名
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename ふにゅう.zip => うにゅう.zip (100%)
gaulm:test nawolets$ ls -il .git/objects/48/e18a8c202ac232aa91a20619c3376b647fa467
108381 -r--r--r--+ 1 nawolets  staff  49222381  9 15 08:44 .git/objects/48/e18a8c202ac232aa91a20619c3376b647fa467
gaulm:test nawolets$ 

inode番号に変化はないようです。objectsのファイル名にも変化はない模様。
どうやら、リポジトリ内のオブジェクトファイルは変更されないみたいですね。これなら大量、大容量のファイル移動や改名を行っても負荷はそれほど大きくならずにすみそうです。