【gitをソフト開発で使いこなそう!:最終回】.gitignoreの書き方を徹底解説!
今回は、.gitignoreのファイルの書き方について解説していくと共に、README.mdやLICENSEといった特別な役割を持つファイルについても簡単に紹介していきます。
- 特別な役割を持つファイル
- README.md
- LICENSE
- .gitignoreとは?
- .gitignoreの書き方
- ワイルドカード
- 既にコミットしたファイルを無視したい
- 最後に
- より深く学びたい人のために
- う-ん、よく分からん!
- 参考文献
特別な役割を持つファイル
gitやGitHubでは、特別なファイル名を付けたファイルをリポジトリに置いておくと、特別な役割を果たすものがあります。
その代表例が、
- README.md
- LICENSE
- .gitignore
です。もちろんこれ以外にも特別なファイルは存在します。 以下に、いくつか挙げますので興味のある方は調べてみてください。
[GitHubにおける特別なファイル]
- PULL_REQUEST_TEMPLATE.md
- CONTRIBUTING.md
[gitにおける特別なファイル]
- .gitattributes
- .gitmodules
README.md
この名前を付けたファイルをリポジトリに置いておくと、下の画像のようにREADME.mdの内容が表示されます。
この機能を使うことで、初めてリポジトリを見に来た人に「このリポジトリってどんなリポジトリなんだろう?」ということを伝えることが出来ます。
上の画像は、私が前回紹介したプルリクエスト練習用のリポジトリです。
「このリポジトリはどんなリポジトリなのか」ということを解説しているのが分かるでしょうか。
.mdという見慣れない拡張子があります。これは、Markdownファイルの拡張子を表します。
「README」という名前さえついていれば、上の画像のようにファイルの内容が表示されますが、Markdownファイルとしては認識されません。
LICENSE
GitHub上で公開されているソースコード(ソフト)は、確かに無料で利用することが出来ますが、どんな利用をしてもいいというわけではありません。
ソフトの制作者が「こういう使い方だったらいいよ」と言わない限り利用することは出来ません。
LICENSE
という名前のファイルに先ほど言ったこと、いわゆる「リポジトリの利用規約」を書いておくと、下の画像のようにGitHubによってライセンスの種類が表示されます。
ライセンス
自分で一からライセンスを書いても、もちろん構いませんが、既に作成され公開されているライセンスを適用するのが普通です。
例えば次のようなライセンスがあります。
ライセンス関連の話は、本題から大きくそれるため詳しくは述べませんが、興味のある方は参考文献をご覧ください。
.gitignoreとは?
.gitignoreを使う場面
gitでファイルを管理していると「このファイルはgitで管理したくないな」と思う場面があります。
例えば、次のようなファイルです。
- ソースコードをビルド(コンパイル)して出来た実行可能ファイル(~.exeなど)
- ソースコードをビルドすれば、生成できるためわざわざgitで管理する必要がない
- ビルドする時に一時的に作成されるファイル
- これもビルドすれば生成される上に、わざわざ管理する必要がない
- 個人的なメモ書き
- 本当にただのメモ書きであれば、管理する必要もない
このような時.gitignore
という名前のファイルを置くと、ある特定のファイルを無視することが出来ます。
Windows 10 Version 1903(2019年5月21日公開)より前のWindows10では、エクスプローラー上で.gitignoreのような、ドットから始まるファイルを作成することが出来ませんでした。
.gitignoreと検索すると、「.gitignoreという名前のファイルが作れない!」といった名前の記事が出てくるのはそのためです。
Windows 10 Version 1903によって、ドットから始まるファイルをエクスプローラー上で作れるようになり、変な裏技を使う必要はなくなりました。
.gitignoreの優先順位
.gitignore
は、一つのリポジトリに複数置くことが出来ます。
ある一方の.gitignore
には「ファイルAを無視しろ!」と書かれているのに、もう一方の.gitignore
には「ファイルAは無視しない」と書かれていたらどうなるのでしょうか。
その場合、より深い階層に置かれている.gitignore
が優先されることになっています。
上の例であれば、「ファイルAは無視しない」という指定が優先されます。
.gitignoreの書き方
.gitignore
の実体は、単なるテキストファイルです。次のように書かれます。
# Exclude text files *.txt *.md # Exclude specific directories /[Mm]emo/ /[Mm]anualtest/test/ tada/ /tmp/* !/tmp/test.txt
以下具体的な書き方について、見ていきます。
基本的には、除外したいファイルやフォルダを書いていくだけです。
除外したいファイルやフォルダが、下のフォルダにあったら、.gitignore
を基準にして、相対パスで指定します。
相対パスって何だ?と思われた方は、下の記事をご覧ください。
https://wa3.i-3-i.info/word1167.htmlwa3.i-3-i.info
(ただし.gitignore
では、./フォルダ1/フォルダ2
のような相対パスの一番先頭にある.
は必要ありません。)
# .gitignoreと同じフォルダに入っているファイルを無視する /test.txt /test.md # subフォルダを除外 /sub/
空白行とコメント
.gitignore
において、空白行は何の働きもしません。無視されます。
そのため上の例のように、見やすくするために、空白行を挿入しても構いません。
また、#
を行の先頭につけると、コメントを付けることが出来ます。
#
を付けた行は、何の働きもしなくなります。(一般的なプログラミング言語で言う「コメント」と同じ役割です。)
ファイル名やフォルダ名だけを書く
test.txt
やbuild
フォルダといった、ファイル名やフォルダ名のみを一つの行に書くと、その.gitignore
のサブフォルダ以下にある全ての指定されたファイルやフォルダを無視します。(サブフォルダ以下です。.gitignore
が置かれている上のフォルダには、その.gitignore
の影響は及びません。)
……少しわかりにくいでしょうか?
一つ例を挙げましょう。
リポジトリの構成が下の図のようになっているとします。
ここで、.gitignore
に
test
と書かれていたとします。すると、上の図のA
とB
が除外されることになります。
(フォルダが除外された場合、フォルダの中身のファイルも除外されます。)
名前の最後にスラッシュ(/)をつける
名前の最後にスラッシュをつけると、設定が書かれた.gitignore
のサブフォルダ以下にある全ての指定されたフォルダのみを無視します。
.gitignore
に、
test
と書いたときは、A
とB
が無視されましたが
test/
と書いたときには、ファイルであるB
は無視されず、フォルダであるA
のみが無視されます。
名前の最後以外にスラッシュが入っている
.gitignore
を基準にして、相対パスで指定される、ファイルやフォルダを無視します。
と言ってもいまいちピンと来ないため、下のような例で考えてみます。
ここで.gitignore
に、
main/sub/test
と書くと、.gitignore
が置かれているフォルダを基準にした相対パスとして認識されます。
この例だと、main
フォルダにあるsub
フォルダのtest
ファイルとtest
フォルダを無視する、という設定になっています。
また、ここで
main/sub/test/
のように、名前の最後に/
をつけると、main
フォルダにあるsub
フォルダのtest
フォルダのみを無視するようになります。
!
行の先頭に!
をつけると、以降のファイル名やフォルダ名を無視しないという意味になります。
この設定で、前の設定を上書きすることが出来ます。
次のような.gitignore
を考えます。
/test/* !/test/reigai.txt
一行目で、test
フォルダにある全てのファイルやディレクトリを無視していますが、二行目でtest
フォルダにある、reigai.txt
を無視する設定から除外しています。
一見矛盾する設定のようですが、!
による指定は、前の設定を上書きするため「testフォルダにあるreigai.txt以外のファイルやフォルダは、無視する」という意味になります。
もしかすると、「こうでもいけるんじゃない?」と思った方がいらっしゃるかもしれません。
/test/ !/test/reigai.txt
しかし、これは思うように動きません。なぜなら、gitの仕様上フォルダそのものを無視した場合、後から一部のフォルダやファイルだけを無視しないようには出来ないからです。
最初に挙げた例が動作するのは、フォルダそのものではなくフォルダの中にあるファイルとディレクトリを無視するように設定しているからです。
……何だか、面倒くさい仕様ですが、そのような仕様になっている以上仕方ないのです。
ワイルドカード
*(アスタリスク)
「ある特定のファイルやフォルダ」ではなく、「~.txt
や~.exe
と言った特定の拡張子のファイルを全て除外したい」と言った場面があるかもしれません。
そのような場合、.gitignore
に次のように書きます。
*.txt *.exe
*(アスタリスク)は、/
(スラッシュ)以外の0文字以上を表します。
ですから、次のようなファイル名が指定されたのと同じ意味を持ちます。(下はあくまで例です。上の文を満たすファイルはいくらでもあります。)
- test.txt
- ttt.exe
- setup.exe
- .txt (ドットの前に一文字も無くても良い。なぜなら0文字以上だから。)
- /test/sub/file.txt (フォルダが指定されていても、構わない。)
?
/
(スラッシュ)以外の任意の1文字を指します。
[~]
[
と]
の中に入っている、/
(スラッシュ)以外の一文字が指定されます。
例えば、manual.txtとManual.txtを除外したいとき、
manual.txt Manual.txt
と書いてもいいですが、
[Mm]anual.txt
と書くことも出来ます。[Mm]
はMかmどちらかの文字が指定されたとき、という意味だからです。
既にコミットしたファイルを無視したい
既にコミットしてしまったファイルを、後から.gitignore
で無視するよう設定しても無視されません。
既にコミットしてしまったファイルを無視させるには、下のコマンドを入力する必要があります。
無視したいものが、ファイルだった場合。
git rm --cached <ファイル名(例:test.txt)>
無視したいものが、フォルダだった場合。
git rm -r --cached <フォルダ名(例:folder)>
delete……
と画面上に表示されますが、ファイル自体が消えたわけではないため、安心してください。
-r
オプションは、「<フォルダ名>のサブディレクトリ以下に入っているファイルも全て」という意味になります。
次コミットするときに反映されます。
ちなみに、--cached
オプションを忘れると一見ファイルが本当に削除されたように表示されますが、すぐに復旧できます。
下のコマンドを順に入力してください。
git reset HEAD git checkout HEAD <ファイル名orフォルダ名>
最後に
これで「gitをソフト開発で使いこなそう!」は、終了となります。
「gitをソフト開発で使いこなそう!」をお読みいただきありがとうございました。
より深く学びたい人のために
こっそり始めるGit/GitHub超入門
この連載では、gitをソフト開発で使いこなそうで扱えなかったGitHubの機能がいくつか解説されています。
う-ん、よく分からん!
この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。
参考文献
Pro Git
git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com
今日から始めるOSSライセンス講座
OSSライセンス、オープンソースソフトウェアライセンスについての概要が書かれている連載です。
文化庁著作権テキスト
https://www.bunka.go.jp/seisaku/chosakuken/seidokaisetsu/pdf/r1392388_01.pdfwww.bunka.go.jp
OSSライセンスとは直接関係はありませんが、OSSライセンスの土台となっている「著作権」について詳しく学ぶことが出来ます。
文化庁が公式で出しているものです。