SubversionからGit移行時に苦労したこと、空のフォルダの移行、文字化け対策

Git

最近、巨大なSubversionリポジトリをGitに移行する作業を行っており、その際に学んだからフォルダの移行方法、文字化けの回避方法を書き留めておきます。

スポンサーリンク
スポンサーリンク

Gitで空ディレクトリの扱うときには、.gitkeepを使う

Gitではディレクトリに関する情報を保持していないようです。

空のディレクトリを作っても、リポジトリにコミットできません。

こんな感じになります。

$ mkdir aaa
$ git add aaa
$ git commit
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

空ディレクトリを保持するには、慣習的に.gitkeepという空のファイルをフォルダにおくようです。

.gitkeep自体は、いわゆるプレースホルダーで、Gitの仕様ではありません。

要はなんでもいいけどファイルが必要なので、慣習的に.gitkeepを使うようです。

こんな感じになります。

$ mkdir aaa
$ touch aaa/.gitkeep
$ git add aaa
$ git commit -m "add directory"
[master 79cd8fc] add directory
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Test/aaa/.gitkeep

空ディレクトリをリポジトリに保持できないのは、Gitの仕様とはいえ不便ではあります。

その昔、CVSを使っていた時も同じ仕様で、空ディレクトリはリポジトリに保持できませんでした。

例えば、ディレクトリがあるという前提で動いているプログラムがあったときに、実行して初めて、エラーを吐いたり気づいてディレクトリを作ることがありました。

Subversionでは、そういったCVSの制限が解消されていて便利と思ったのですが、Gitでは逆戻りなんですね。。

git svnコマンドで Subversion から Git へ空ディレクトリを移行

git svnコマンドを使って、リポジトリをSubversionからGitへ移行してみて、空のディレクトリが移行できないことに気づきました。

その後、いろいろと調べてみると、

git svn には、

--preserve-empty-dirs

というオプションがあって空のディレクトリを移行できることがわかりました。

こんな感じで使います。

$ git svn clone --trunk= --prefix=svn/ --preserve-empty-dirs svn://aa.bb.cc.dd/repository/path

このオプションを使うと、デフォルトでは空フォルダには、

.gitkeep ではなくて、

.gitignore というファイルが作成されます。

空フォルダに、デフォルトで .gitkeep が作成されないのが、府には落ちないところもありますが、.gitkeep は慣習的にその名前を使うというだけで、Git の仕様にはその名前のファイルがないからなんでしょう。

このプレースホルダーは、

--placeholder-filename=<filename>

というオプションで別名に変更することが出来ます。

ちなみに、.gitignore というファイルは、Git の仕様に存在して、中にファイルを書いておけば、そのファイルが Git では管理されないファイルとして認識されます。

CVSでは.cvsignore、

Subversionでは.svnignore

という名称で同じ用途のファイルがあります。

リネームしたファイルの履歴を追いかける git log --follow

ちょっと話題は変わってファイルの履歴の話です。

test.txt というファイルがGitで管理されていたとします。

このファイルをaaaというディレクトリに移動したとしましょう。

この時、以下のコマンドでは移動後のファイルの履歴しか追えないようです。

$ git log test.txt

こういう時には、

--followオプションを使います。

$ git log --follow test.txt

followオプションを使うと、リネームしたファイルの履歴も追いかけることが可能です。

このオプション、Webのインターフェースがあれば良いのですが、探した範囲では見つけることが出来ませんでした。

Git Bash の lsコマンド日本語文字化けを直す

さらに話は変わって、Git Bashの日本語の文字化けの話です。

Git自身は日本語をUTFで扱っているようです。

Git Bashでコマンドラインの環境変数では、UTF8と表示されるのですが、lsコマンドで表示される日本語のファイル名が文字化けしてしまいます。

以下のように実行すると文字化けは解消されます。

$ ls --show-control-chars

納得はしないですが、.bash_profileに以下の通りに書いておきました。

alias ls='ls --show-control-chars'

文字化けと言えば、TortoiseGitではexport(archive)した時の、日本語も文字化けします。

これ自体は、どうしようもないので、コマンドラインから

git archive を実行して

exportすることとします。

Gitについてのおすすめの本

↓Gitについてのおすすめの本はコチラ

Git