git使ってるとまれによくほしくなってくる.gitkeepファイルですが、Windowsだとこれを用意するのは地味に面倒です。
というのもWindowsのエクスプローラーでは「.」から始まるファイルを作る事が出来ないからです…
(右クリックの新規作成から、テキストファイル選んで「.gitkeep」と入力してみてください。「ファイル名を入力してください」というエラーが出ます。エラーが出ない人は「.gitkeep.txt」というファイルが出来上がっています。)
.gitkeepとは?
そもそも.gitkeepというファイルについてですが、これはディレクトリを管理することが出来ないというgitの特性の為のものです。
gitはファイルは管理できるものの、ディレクトリが管理できません。なのでファイルが無い空のディレクトリを共有することが出来ないのです…
よくある失敗談としては、
Unityで空のディレクトリHogeを用意、UnityによってそのmetaファイルHoge.metaが生成される。
しかし、git管理化にはmetaファイルのみが追加される為、他のユーザーではHoge.metaが削除される事に…
(Unityはmetaファイルに対応するファイルやディレクトリが無いとmetaファイルを削除します。)
しばらくして、Hogeフォルダ内にデータFuga.pngが追加されたが、各個人でmetaが違う為シーンファイル開くとMissingが…
何やらデータを出力するツールを用意したが、めんどくさいので規定のHogeフォルダに出力するように実装した。
実装コスト削減の為Hogeフォルダがある前提の実装に。
しかし、Hogeフォルダはほかの人と共有されていなかったため、ツール使用でエラーが発生する事に…
といった感じでしょうか。
こういう時の為に.gitkeepというファイルを空のディレクトリに入れて、git管理下に置きます。
.gitkeepは.gitignoreなんかと違って、ただのファイルとして扱われてgitに何も特別な効果はありません。
ついでにUnityでも.gitkeepは無視されるようです。
(gitの管理にファイルが必要なら意味のないファイル入れとけばそれでいんだろうという結構雑な理屈ですね。)
.gitkeepを新規作成に入れる
というわけでデスクトップに.gitkeep用意してそれをコピペするのは微妙に手間なので、右クリックに入れることにしました。
※以下の作業はレジストリを操作します。操作を誤るとPCの挙動が不安定になったり、最悪起動しなくなる等の不都合が発生する可能性があります。
また、これによって何か問題が起きても私は一切責任を負いませんので、自己責任でお願いします。
レジストリ操作がよくわからない人はやめておいた方が無難です。
まずは.gitkeepを生成するバッチを用意する
まずバッチファイルを用意します。
ファイル名はなんでもいいですが、私は「new.gitkeep.cmd」にしました。
type > "%~dp1\.gitkeep"
中身は超単純にtypeコマンドをリダイレクトして空のファイルを生成しています。
コマンドライン引数で新規作成で指定されたパスが来る想定です。
厳格にするなら%1の中身がちゃんとパスかを判定したほうがよさそうですがめんどくさいのでこれだけで。
レジストリの設定する
次にレジストリに設定を追加して、右クリックの新規作成に項目を追加します。
早速regeditを起動します。
1.
まず、HKEY_CLASSES_ROOTを右クリックし「新規」→「キー」を選択し、名前を「.gitkeep」とします。
2.
次に先ほど作った.gitkeepキーの規定のデータを「GIT.gitkeep」に設定します。
3.
.gitkeepを右クリックして、「新規」→「キー」を選択し、名前を「ShellNew」にします。
4.
ShellNewを右クリックして、「新規」→「文字列値」を選択し、名前を「Command」、データを「先ほど作ったバッチのフルパス “%1”」に設定します。
5.
再度、HKEY_CLASSES_ROOTを右クリックし「新規」→「キー」を選択し、名前を「GIT.gitkeep」とします。
6.
GIT.gitkeepの規定のデータを「.gitkeep」に変更します。
7.
GIT.gitkeepを右クリックし「新規」→「キー」を2つ作成し、それぞれ「DefaultIcon」と「Shell」とします。
8.
DefaultIconの規定のデータを適当なアイコンのパスに設定します。お勧めはgitがインストールされている場所のetc\git.icoです。
9.
Shellの規定のデータを「Open」に変更し、「新規」→「キー」を選択し、名前を同じく「Open」にします。
以上で完了です。
これを.regファイル形式で表すと以下のようになります。
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.gitkeep] @="Git.gitkeep" [HKEY_CLASSES_ROOT\.gitkeep\ShellNew] "Command"="バッチの場所 \"%1\"" [HKEY_CLASSES_ROOT\GIt.gitkeep] @=".gitkeep" [HKEY_CLASSES_ROOT\GIt.gitkeep\DefaultIcon] @="アイコンの場所" [HKEY_CLASSES_ROOT\GIt.gitkeep\Shell] @="Open" [HKEY_CLASSES_ROOT\GIt.gitkeep\Shell\Open]
問題点もある…
2点問題点があります。
上書き確認されない
リダイレクトで生成しているので、すでに.gitkeepがある際に上書き確認されません。
もし、何か意味のある.gitkeepという名前のファイルがある場合は要注意です。
デスクトップだと生成されない?
デスクトップでこれを実行した場合、一見ファイルが生成されていないように見えます。
が、デスクトップでF5を押すなどして更新するとファイルが表示されます。
ちょっと発展形
これで新規作成に.gitkeepが追加されているのですが、実行してみると一瞬コマンドプロンプトの黒い画面が出現します…
これを表示せずに裏でこっそり処理が走るようにしたいと思います。
WSHを使う
WSHを利用する事で画面を表示させずにバッチを実行させることが出来ます。
WSHファイル(vbs)を用意します。名前はなんでもいいです。私はバッチと同じ「new.gitkeep.vbs」にしました。
CreateObject("WScript.Shell").Run "バッチのフルパス "& WScript.Arguments(0) ,0
これだけです。
バッチのパスの後に半角スペースがあるので忘れないようにしてください。
,0の部分がウインドウ非表示で実行するのを表してます。
「HKEY_CLASSES_ROOT\.gitkeep\ShellNew」のデータをバッチから先ほど作成したvbsに更新するのも忘れずに。
これで黒画面が出ずに.gitkeepが指定のフォルダに出現します。
みなさんも存分にgitkeepしてください。