.gitignore の書き方

動機と概要

自分はhspiceというCUIのSPICEを頻繁に使用しており,それらのコードの管理にGitを用いている. しかし,hspiceの出力ファイルが膨大になりすぎてインデックスに追加したりコミットするのにも時間がかかるようになった. そこでそのようなファイルのみをgitの管理下から取り除く方法を紹介する. 流れとしては
1. .gitignoreの記述
2. すでに管理下に追加されているものを外す
の順に進める.

.gitignoreの記述

.gitignoreというファイルをレポジトリ内に置いて,その中にGit管理の対象外にしたいファイルを指定する. 最近はgiboと呼ばれる.gitignoreを自動生成してくれるツールがあるため,自分のような特殊な用途以外の方はそちらを参考にしたほうが良いかもしれない.
まずレポジトリ内に.gitignoreを作成する. レポジトリ内であればどこでもよいし異なるディレクトリに複数作成しても良いが,最初に触るときは直下に置くのが簡単だと思われる.

\の記法

記法 除外対象
/をつけない filename .gitignore以下のすべてのディレクト
にあるディレクトリ及びファイル
末尾の/ filename/ .gitignore以下のすべてのディレクト
にあるディレクト
冒頭の/ /filename .gitignoreがあるディレクトリからの相対パス
指定されるディレクト

ワイルドカードも使用可

!の用法

!filenameなどと指定することで指定されたパスを除外しないようにできる. また,上の方法で除外した対象を塗り替えて指定できる.

既に追加されているファイルの除外

下記のコマンドですでに追加されているファイルを除外する.--cachedを抜くとファイルごと削除されてしまうので注意.

$ git rm --cached <file>

fatal: pathspec did not match any files のようなエラーが出た場合は,--ignore-unmatchを追加する.

$ git rm --cached --ignore-unmatch <file>

実際にやった処理

hspice から出力されるファイルは拡張子が特殊(.tr0,.mt0など)であるため指定しやすい. また,自分は各プロジェクトごとにoutputディレクトリを作りそこにhspiceの結果を出力するようにしているので.gitignore内にoutput/を追記すればよいことが分かった.
また,それらを整形したデータをdataディレクトリに保存しているのでそれらも除外する.
実際に書いた.gitignoreは以下の通り.

*.txt
*.lis
*.ic*
*.mt*
*.mc*
*.pa*
*.st*
*.sw*
*.tr*
output/
data/    

この後,すでにインデックスに追加されていた管理対象外にしたいファイル類を管理下から外す. 自分の場合は各プロジェクトのoutput下とdata下を外したかったので以下を実行.

$ git rm --cached --ignore-unmatch **/output/
$ git rm --cached --ignore-unmatch **/data/

後はコミット,プッシュして終了.
大容量の出力ファイルをGit管理下から外すことで,gitの処理に時間がかからなくなり快適になった. 同じ事態に陥っているは方はぜひ早めに取り組みましょう.