💾

gitignore ホワイトリスト方式(管理対象の明示的指定)

2022/01/16に公開1

gitignore ホワイトリスト方式(管理対象の明示的指定)

例示

# .gitignore
# Ignore All
*
!*/

# Allowlist
!.git/*
!.gitignore
!.gitattributes
!*.c
!*.cpp
!*.h
!*.js
!*.py
!*.sh
!*.json
!*.md
!*.txt
!*.tsv
!*.csv
!*.svg
!*.pdf

原理

まず, gitignoreは次の記述ができる[1]. (標準globパターンとは *:ワイルドカード, ?:任意一文字, [a-z]:文字セット.)

.gitignore ファイルに記述するパターンの規則は、次のようになります.

  • 空行あるいは # で始まる行は無視される
  • 標準の glob パターンを使用可能
  • 再帰を避けるためには、パターンの最初にスラッシュ (/) をつける
  • ディレクトリを指定するには、パターンの最後にスラッシュ (/) をつける
  • パターンを逆転させるには、最初に感嘆符 (!) をつける

例示で要となるのは次の5行である

  1. * 全てを管理対象から外す
  2. !*/ 全てのディレクトリを管理対象にする(戻す)
  • もし, やはり含めたくないディレクトリがあるならこの下にbuild/といった形で追加.
  1. !.git/* .gitディレクトリ配下の全てのファイルを管理対象にする(戻す)
  2. !.gitignore .gitignoreファイルを管理対象にする
  3. !.gitattributes .gitattributesを管理対象にする

残りは実際に管理対象にしたいファイルを続けて記述していく. 拡張子なら!*.extだし, 拡張子を持たないなら!Doxyfileとかになる.

補足

既に追跡(登録)されてしまっているファイルの履歴管理対象からの削除は次のコマンドで行う. 実体のファイルは残る.

$ git rm -r --cached <file>

.gitignoreのテンプレートはGitHubのgitignoreテンプレートや, .gitignore.ioがあり, ほとんどの言語が揃っている. しかし, これらは(まぁ素直な)管理対象から外すという形での記述が大部分である. 個人で慎ましくファイルの管理をやるなら, 何を管理対象とするか, を指定したほうがすっきり書けることもある.

参考

脚注
  1. &1 の p29 ↩︎

Discussion

td-shitd-shi

許可方式だろうが, 禁止方式だろうが, 適用範囲が巨大になればなるほど複雑になる. そんなときはいっそリポジトリごと分割するのも手だろうか.