Closed1
Gitで空ディレクトリをチェックインする

調べても、ざっくりしすぎな記事とか.gitignoreを重ねる方法とかばかり引っかかるので。
logsディレクトリを中身空でGitにチェックインしたい場合、
-
logs/.gitkeep, もしくはlogs/.keepを作成する。ファイルの中身は空で良い
$ mkdir logs/ $ touch logs/.gitkeep
-
.gitignoreに、以下のように記載する(.gitkeepを採用した場合):
.gitignore# Keep empty logs/ directory. /logs/* !/logs/.gitkeep
logs/ディレクトリのすべての中身を一旦ignoreしつつ、/logs/.gitkeepのみやっぱり拾う、という設定。
仕組みの説明
Gitはファイルのみを管理する=ディレクトリのチェックインはしない。ディレクトリについては、コミットされたファイルパスを再現する際に、途中のディレクトリが無ければ、作られる...というような感じ。
そこで、空ディレクトリをGit管理したい場合は、仕方なくダミーのファイルでlogs/を含めたコミットを作りつつ、ただしlogs/配下の他のファイルはGitの管理に入らないようにするよ、これで(ダミーのファイル以外は)空のlogs/ディレクトリが得られるね、という方法を取る。
ポイントは、
-
ディレクトリ名の先頭に
/
をつける- 無いと、「階層問わず名前がlogsのディレクトリ」になってしまう
-
/logs/のあとにワイルドカード
*
をつける- 無いと、「logs/ディレクトリをignore」になってしまう[1]
If there is a separator at the end of the pattern then the pattern will only match directories, otherwise the pattern can match both files and directories.
- ignoreしたいのは「logs/配下のファイルなんでも」。
ファイルゼロなら、結果的にそのディレクトリ自体もGitにチェックインされない
- 無いと、「logs/ディレクトリをignore」になってしまう[1]
- 最後に、logs/.gitkeepのみチェックインを許可する
- .gitignoreファイルの末尾に
.gitkeep
と書く(階層問わずどこかの.gitkeepを許可)よりも、近くに・限定的に書いたほうが、見た人がわかりやすいと思う
- .gitignoreファイルの末尾に
-
ディレクトリ名の先頭に
このスクラップは2022/11/28にクローズされました