リスティング広告代行の専門会社|Yahoo!プロモーション広告・Google AdWords完全対応|東京・大阪・名古屋

Gitで空のディレクトリを管理する方法の復習


Gitで空のディレクトリを管理したい場合、.gitkeepという名前の0バイトのファイルを置いておくというのが慣習ですね。

管理対象にしたい空のディレクトリというのは、多くの場合、アプリが使用するキャッシュディレクトリや一時ディレクトリのようなものだと思います。

つまり、そのディレクトリがないとアプリによるファイルの出力が失敗してしまうのでディレクトリ自体は管理下に置いておきたいけど、アプリがそこに出力したファイル群は管理外にしたい、というケースです。

このような場合に、.gitignoreの設定やgit addの仕方など、具体的にどのような手順で運用するとすんなり行くかを復習がてらまとめてみましたので、参考にしてみてください。

.gitignoreの設定とgit addの方法について

ケース1:ディレクトリ階層が一階層の場合

例えば、app_root/app/tmp/ というディレクトリを空の状態でGitの管理下に置きたいという場合を考えてみましょう。

この場合、app_root/app/tmp/.gitkeep を作成し、app_root/.gitignore を以下のような内容にしておけばOKです。

app/tmp/*
!.gitkeep

これは至って普通ですね。

ケース2:ディレクトリ階層が複数階層の場合

では、もう少し複雑なケースで、

  • app_root/app/tmp/
  • app_root/app/tmp/cache/
  • app_root/app/tmp/log/

の3つのディレクトリを空の状態(ディレクトリだけがあって他にファイルがない状態)でGitの管理下に置きたいという場合はどうでしょうか。

この場合、同じように

  • app_root/app/tmp/.gitkeep
  • app_root/app/tmp/cache/.gitkeep
  • app_root/app/tmp/log/.gitkeep

を作成し、app_root/.gitignore を

app/tmp/*
!.gitkeep

としても、期待どおりの動作にはなりません。この状態で git add . をしても、app_root/app/tmp/.gitkeep だけしか追加されず、子階層の .gitkeep は無視されてしまいます。

 .gitignoreでは、「ディレクトリ配下をすべて無視する」とした場合、その直下のファイルについては「!」で除外ができますが、さらに下の階層のファイルにまでは「!」が効力を持たないようですね。

■ 対応策

この場合、.gitignoreの内容を以下のようにすると期待どおりの構成が作れます。

app/tmp/*
!app/tmp/cache/
!app/tmp/log/
!.gitkeep

.gitkeep の除外を行う前に、予め chache/ および log/ ディレクトリを除外しておくイメージですね。

もし、.gitignoreをシンプルに保ちたいようであれば、.gitignoreの内容自体は

app/tmp/*

これだけにしておいて、

$ git add -f *.gitkeep

とすることで、全ての .gitkeep ファイルを強制的に追加する、という方法でもいいかもしれません。

ディレクトリのパーミッションについて

ところで、アプリがファイルを出力するための一時ディレクトリということは、Webサーバの実行ユーザに書き込み権限がなければいけません。

Webサーバの実行ユーザと一時ディレクトリのオーナーが常に同一であればよいですが、複数の環境で開発を行う場合そうもいかないこともあるかと思います。

Gitでは、ファイルのパーミッションは管理対象ですが(ただし excecutable ビットのみ)、ディレクトリのパーミッションは管理できません。

もし、ディレクトリのパーミッション設定を再現する手段が必要であれば、それを行うシェルスクリプトを別途ソースツリー上に置いておくしかないかと思います。

上述の例なら、以下の内容の app_root/init_dir_permissions.sh のようなシェルスクリプトファイルを置いておくイメージでしょうか。

#!/bin/bash
chmod a+w app/tmp
chmod a+w app/tmp/cache
chmod a+w app/tmp/log

もし composer を使っているようなら、post-install-cmd でこの init_dir_permissions.sh を自動実行するようにしておくと便利かもしれません。



業界初のリスティング広告運用総合支援ツール Lisket(リスケット)

Facebookもチェック