Hugoで下書きの記事を作成する際、それ専用のディレクトリを保持しておきたかった。

しかし、常時下書きのmdがあるわけじゃ無い為、空のディレクトリの状態ではGitでコミット出来ない。それでも空のディレクトリをGitの管理下に置きたかった。

調べてみるとそれを可能にする方法があったので、要点だけまとめた備忘録を残す。

目次

結論

空のディレクトリに.gitkeepまたは.gitignoreを追加する。2つの違いは以下の通りだが、こだわりが無いなら.gitkeepで作ればOK。

  • .gitkeepがある空のディレクトリに新規ファイルが追加された時、そのファイルをGitの管理対象に含める
  • .gitignoreがある空のディレクトリに新規ファイルが追加された時、そのファイルはGitで管理対象に含めない

追加の仕方

空のファイルを作るのでtouchコマンドを使えばOK。1

mkdir hoge
touch hoge/.gitkeep
または
touch hoge/.gitignore

もう少し詳しく

.gitkeep.gitignoreの使い分けについて参考になった部分を引用。2

.gitkeep を使う基準と例
.gitkeepは、「デフォルトではファイルが存在しないけれど、ファイルが追加されたら、そのファイルを Git での管理対象にしたい」場合 に使います。

例えば、lumen の databse/migration ディレクトリなどは、良い例です。
このディレクトリは、データベースの初期化をするスクリプトをおいておくために使われるディレクトリなので、「フレームワーク開発者的には、 デフォルトでおいておくファイルは特にない。しかし、 ユーザが作ったファイルは Git でバージョン管理する対象にしたい 」というユースケースが容易に想定できるので、 .gitkeep が使われています。

.gitignore を使う基準と例
.gitignore は、「デフォルトではファイルが存在しないし、そこに作られたファイルもバージョン管理したくない」場合 に使います。
例えば、「ログの出力先」やキャッシュ置き場などです。ログファイルやキャッシュファイルは、 バージョン管理する必要がありません。むしろ、したくないでしょう。

コミットに含めるべきなのに含められていない例
コンパイル結果の出力先ディレクトリは、ディレクトリ自体をバージョン管理の対象に含めなくて良い、と言いました。しかし、 TypeScript は別です。

TypeScript の、コンパイル結果の出力先のディレクトリは、バージョン管理の対象になっていないことが多いようです。例えば、ionic の dist ディレクトリなどがそうです。

拡張子 .js は、ヘルパースクリプトを書いたりしたときや、 gulp.js などに使用されるので、他のコンパイル言語と違って、 拡張子を用いて .gitignore できません 。
さらに、出力されるディレクトリをしていするにしても「一般的な共通認識がない」ためにディレクトリを .gitignore に追加することが好ましくありません。ディレクトリ自体をバージョン管理の対象から外してしまった場合、プロジェクトのディレクトリ構造がわからなくなってしまいます。わざわざディレクトリ構造を調べるためだけに、 package.json や gulp.js に処理を追加するのは馬鹿げている、と私は思います。

このような場合に、「 空のディレクトリを保持する目的で使用する .gitignore 」が便利です。


  1. touchコマンドの使い方 ↩︎

  2. 空のディレクトリを維持するための、 .gitkeep と .gitignore の使い分け ↩︎