ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

.gitignoreで、あるディレクトリの中身すべてを無視しない

次のようなディレクトリ構成があるとします。

├hoge2.txt
├hoge1.txt
├.gitignore
└main/
 ├ taskA/
 │ └ taskAA/
 │   └ taskaa.py
 └ test1.py
 └ test2.py

main/ディレクトリの中すべてのみをgitで管理したかったので、次のように書きました。

.gitignoreの中身

*         # すべて無視する
!/main/*  # ただしmain/ディレクトリ以下のファイルすべては除く

しかしこれではうまくいきませんでした。
この状態で git add . しても、なにもステージングされません。
この状態でステージングできるのは、main/ディレクトリのみです。しかし、gitは空のディレクトリのみは管理できないらしいので、実際は何もステージングされないということ(らしい)です。

main/ディレクトリ以下のファイルをステージングしたいならば、まずmain/ディレクトリ自体を除外する必要があります。

.gitignoreの中身

*         # すべて無視する
!/main/   # ただしmain/ディレクトリは除く
!/main/*  # ただしmain/ディレクトリ以下のファイルすべても除く

これでもまだダメです。
この状態でgit add .したら、次のファイルがステージングされます。

  • main/test1.py
  • main/test2.py

どうやら、ステージングされるのはmain/ディレクトリ直下のファイルのみのようです。
main/ディレクトリ直下のディレクトリも含めたすべてをステージングしたいならば、次のようにします。

.gitignoreの中身

*           # すべて無視する
!/main/     # ただしmain/ディレクトリは除く
!/main/**   # ただしmain/ディレクトリ以下のファイルもディレクトリすべても除く

これでOKです。
git add .すると、次のファイルがステージングされます。

  • main/test1.py
  • main/test2.py
  • main/taskA/taskAA/taskaa.py

難しいですね。

参考URL
http://qiita.com/anqooqie/items/110957797b3d5280c44f