結果
.gitignore
- /configs/*
- !/configs/alpha
- /configs/alpha/*
- !/configs/alpha/one
- /configs/alpha/one/*
- !/configs/alpha/one/test1.py
- !/configs/beta
- /configs/beta/*
- !/configs/beta/test3.py
+ /configs/**
+ !/configs/**/
+ !/configs/alpha/one/test1.py
+ !/configs/beta/test3.py
動機
.gitignoreの例外があまりにも長過ぎるのでどうにかできないかと調べた。調査結果をメモ代わりに保存したい。
環境
- Ubuntu 18.04 LTS
- git v2.17.1
問題
以下のようなディレクトリ構成の時、次のファイルのみを追跡したいとする。
- configs/alpha/one/test1.py
- configs/beta/test3.py
.
└── configs
├── alpha
│ ├── one
│ │ ├── test1.py
│ │ └── test2.py
│ └── test5.py
└── beta
├── test3.py
└── test4.py
このような場合の.gitignore
の表記は以下のようになる
.gitignore
/configs/*
!/configs/alpha
/configs/alpha/*
!/configs/alpha/one
/configs/alpha/one/*
!/configs/alpha/one/test1.py
!/configs/beta
/configs/beta/*
!/configs/beta/test3.py
確認
$ git add ./
$ git status
ブランチ master
コミット予定の変更点:
(use "git reset HEAD <file>..." to unstage)
modified: .gitignore
new file: configs/alpha/one/test1.py
new file: configs/beta/test3.py
$ git reset
除外+例外の追加を繰り返して行っている。
参考:
しかし、この方法は冗長であり、また追加も面倒だ。
対策
以下のように変更を行う
.gitignore
- /configs/*
- !/configs/alpha
- /configs/alpha/*
- !/configs/alpha/one
- /configs/alpha/one/*
- !/configs/alpha/one/test1.py
- !/configs/beta
- /configs/beta/*
- !/configs/beta/test3.py
# 上と同じ例外になる
+ /configs/**
+ !/configs/**/
+ !/configs/alpha/one/test1.py
+ !/configs/beta/test3.py
確認
$ git add ./
$ git status
ブランチ master
コミット予定の変更点:
(use "git reset HEAD <file>..." to unstage)
modified: .gitignore
new file: configs/alpha/one/test1.py
new file: configs/beta/test3.py
$ git reset
同じ結果が得られた。
参考:
例外の追加
また追加したい場合も楽になる。
以下のファイルを追加して、test6.pyのみを追跡したい場合
- configs/gamma/test6.py
- configs/gamma/test7.py
mkdir configs/gamma/
echo "" >> configs/gamma/test6.py
echo "" >> configs/gamma/test7.py
- 従来
.gitignore
+ !/configs/gamma
+ /configs/gamma/*
+ !/configs/gamma/test6.py
- 新規
.gitignore
+ !/configs/gamma/test6.py
確認
$ git add ./
$ git status
ブランチ master
コミット予定の変更点:
(use "git reset HEAD <file>..." to unstage)
modified: .gitignore
new file: configs/gamma/test6.py
$ git reset