覚え書き、ブログ代わりなど不定期に書き散らすWiki


基本的な例


GITで管理したくないファイルを指定する。
ルートフォルダの直下に .gitignore という名前で
ファイルを作り、以下のように記述する。
# #文字は行末までコメント

# 空行や末尾の空白文字も無視される。

# ルート(GITの管理フォルダ)の直下のconfig.ini を無視する。
/config.ini

# /が含まれていないときは、ルート直下でもサブフォルダでも、
# どこにあっても、ファイル名に基づいて判定する。
foo.txt
# 例えばこの場合、どのディレクトリでも、foo.txt という名前のファイルを無視する。

# *は任意の文字列になる。拡張子htmlのファイルをすべて無視する例。
*.html
# この場合、/が含まれていないので、ルート直下でもサブフォルダでも、
# どこにあっても拡張子htmlのファイルがすべて無視される。

# !文字は否定になる。上記設定により*.htmlは無視するけど、index.html は無視しない例。
!index.html

# ディレクトリを無視する場合。
src/

特殊な書き方、より複雑な例など


# ファイル名に#文字や!文字などが含まれているときは \(バックスラッシュないし円記号)でエスケープする。
\#contents\#

# []内に文字を並べると、どれかの文字とマッチする。
*.[ch]
# *.c 又は *.h にマッチする。[0-9]のように文字の範囲指定もできる。

# 複数のパターンにマッチするときは、最後にマッチしたものが優先される。
src/
!/src/hello.c
# src/ で無視する設定になっているが、後から指定した /src/hello.c が優先する。

# *文字は任意のファイル名にマッチするが/にはマッチしない。
/include/*.h
# 上の例は /include/time.h にマッチするが、 /include/sys/time.h にはマッチしない。

# *文字はディレクトリ名にもマッチする。
/include/*/*.h
# 上の例は /include/sys/time.h にマッチする。

# **は特別な意味がある。複数段のディレクトリ階層にマッチする。
/include/**/*.h
# 上の例は /include/time.h, /include/sys/time.h, /include/local/sys/time.h のすべてにマッチする。

# **はファイルもマッチする。
/include/**
# 上の例は /include 配下のすべてのファイル/ディレクトリにマッチする。(この場合は /include/と同じ)

ホワイトリスト方式(管理対象のファイルをすべて指定する)


.gitignore ファイルは、通常は無視するファイルを指定する。
逆に、無視しないファイルをすべて指定して、
何も書かなければ無視するようにもできる。
これがホワイトリスト方式。

/*
!/index.html
!/src/
最初の /* により、いったんすべて無視するように指定している。
その後、(GIT管理フォルダ)/index.html と (GIT管理フォルダ)/src ディレクトリ以下は管理対象としている。
その他は無視する設定になる。

ホワイトリスト方式でサブフォルダを指定するときの注意


/*
!/index.html
!/src/hello.c
この例では、/* により先ずいったん、すべてを無視するよう指定して、
ただし /index.html は無視しないとしている。
これはいいが、ところが次の /src/hello.c を無視しない
(つまりGITの管理対象とする)という指定は効果をもたず、
GITの管理対象とならない。
これはGITの仕様で、/*の指定によって /src ディレクトリの検索が
行われないため。(マニュアルには「性能上の理由により」とはっきり書かれている)

/src/hello.c を管理対象とするには、
/*
!/src/
!/src/hello.c
ただしこれだと、/src/foo.c というファイルがあればこれも管理対象となる。
つまり、こんどは最後の !/src/hello.c が意味をなさなくなる。

/src/ 配下は基本的にすべて無視するが、/src/hello.c だけは無視しないためには、
以下のように書く。
/*
!/src/
/src/*
!/src/hello.c
これが正解。

サブフォルダ内に .gitignore ファイルを置く


ルートフォルダ直下に .gitignore ファイルを置くと最初に書いたが、
サブフォルダ内に置くこともできる。
この場合、.gitignore 内で指定したパスは .gitignore ファイルからの相対パスになる。
私はあまり使わないが、大きなシステムでサブシステム単位で
管理したいときには有用かもしれない。

既にトラックされた(GITで管理されている)ファイルの削除


あるファイル(例えば AAA とする)をコミットした後で、
.gitignore にAAA を加えた場合、既に管理対象になってしまっているため無視されない。
AAAは削除しないで、リポジトリ内のAAAを削除するには、
ターミナルから以下のコマンドを入力する。
git rm --cached AAA
コマンド入力後、(リポジトリ内のAAAを削除したという)この修正をコミットする必要がある。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます