Closed1

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

shuichishuichi

調べても、ざっくりしすぎな記事とか.gitignoreを重ねる方法とかばかり引っかかるので。

logsディレクトリを中身空でGitにチェックインしたい場合、

  1. logs/.gitkeep, もしくはlogs/.keepを作成する。ファイルの中身は空で良い

    $ mkdir logs/
    $ touch logs/.gitkeep
    
  2. .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/.gitkeepのみチェックインを許可する
      • .gitignoreファイルの末尾に.gitkeepと書く(階層問わずどこかの.gitkeepを許可)よりも、近くに・限定的に書いたほうが、見た人がわかりやすいと思う
脚注
  1. https://git-scm.com/docs/gitignore ↩︎

このスクラップは2022/11/28にクローズされました