最近、巨大なSubversionリポジトリをGitに移行する作業を行っており、その際に学んだからフォルダの移行方法、文字化けの回避方法を書き留めておきます。
目次
Gitで空ディレクトリの扱うときには、.gitkeepを使う
Gitではディレクトリに関する情報を保持していないようです。
空のディレクトリを作っても、リポジトリにコミットできません。
こんな感じになります。
$ 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を使うようです。
こんな感じになります。
$ 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
というオプションがあって空のディレクトリを移行できることがわかりました。
こんな感じで使います。
このオプションを使うと、デフォルトでは空フォルダには、
.gitkeep ではなくて、
.gitignore というファイルが作成されます。
空フォルダに、デフォルトで .gitkeep が作成されないのが、府には落ちないところもありますが、.gitkeep は慣習的にその名前を使うというだけで、Git の仕様にはその名前のファイルがないからなんでしょう。
このプレースホルダーは、
--placeholder-filename=<filename>
というオプションで別名に変更することが出来ます。
ちなみに、.gitignore というファイルは、Git の仕様に存在して、中にファイルを書いておけば、そのファイルが Git では管理されないファイルとして認識されます。
CVSでは.cvsignore、
Subversionでは.svnignore
という名称で同じ用途のファイルがあります。
リネームしたファイルの履歴を追いかける git log --follow
ちょっと話題は変わってファイルの履歴の話です。
test.txt というファイルがGitで管理されていたとします。
このファイルをaaaというディレクトリに移動したとしましょう。
この時、以下のコマンドでは移動後のファイルの履歴しか追えないようです。
こういう時には、
--followオプションを使います。
followオプションを使うと、リネームしたファイルの履歴も追いかけることが可能です。
このオプション、Webのインターフェースがあれば良いのですが、探した範囲では見つけることが出来ませんでした。
Git Bash の lsコマンド日本語文字化けを直す
さらに話は変わって、Git Bashの日本語の文字化けの話です。
Git自身は日本語をUTFで扱っているようです。
Git Bashでコマンドラインの環境変数では、UTF8と表示されるのですが、lsコマンドで表示される日本語のファイル名が文字化けしてしまいます。
以下のように実行すると文字化けは解消されます。
納得はしないですが、.bash_profileに以下の通りに書いておきました。
文字化けと言えば、TortoiseGitではexport(archive)した時の、日本語も文字化けします。
これ自体は、どうしようもないので、コマンドラインから
git archive を実行して
exportすることとします。
Gitについてのおすすめの本
↓Gitについてのおすすめの本はコチラ
コメント