【gitをソフト開発で使いこなそう!:最終回】.gitignoreの書き方を徹底解説!

前回の記事

terapotan.hatenablog.jp

連載記事一覧

  terapotan.hatenablog.jp

今回は、.gitignoreのファイルの書き方について解説していくと共に、README.mdやLICENSEといった特別な役割を持つファイルについても簡単に紹介していきます。

特別な役割を持つファイル

gitやGitHubでは、特別なファイル名を付けたファイルをリポジトリに置いておくと、特別な役割を果たすものがあります。
その代表例が、

  • README.md
  • LICENSE
  • .gitignore

です。もちろんこれ以外にも特別なファイルは存在します。 以下に、いくつか挙げますので興味のある方は調べてみてください。

[GitHubにおける特別なファイル]

  • PULL_REQUEST_TEMPLATE.md
  • CONTRIBUTING.md

[gitにおける特別なファイル]

  • .gitattributes
  • .gitmodules

README.md

この名前を付けたファイルをリポジトリに置いておくと、下の画像のようにREADME.mdの内容が表示されます。

READMEが表示されている画像

この機能を使うことで、初めてリポジトリを見に来た人に「このリポジトリってどんなリポジトリなんだろう?」ということを伝えることが出来ます。

上の画像は、私が前回紹介したプルリクエスト練習用のリポジトリです。

「このリポジトリはどんなリポジトリなのか」ということを解説しているのが分かるでしょうか。

Column:Markdownファイルの拡張子

.mdという見慣れない拡張子があります。これは、Markdownファイルの拡張子を表します。
「README」という名前さえついていれば、上の画像のようにファイルの内容が表示されますが、Markdownファイルとしては認識されません。

LICENSE

GitHub上で公開されているソースコード(ソフト)は、確かに無料で利用することが出来ますが、どんな利用をしてもいいというわけではありません。
ソフトの制作者が「こういう使い方だったらいいよ」と言わない限り利用することは出来ません。

LICENSEという名前のファイルに先ほど言ったこと、いわゆる「リポジトリ利用規約」を書いておくと、下の画像のようにGitHubによってライセンスの種類が表示されます。

ライセンス

ライセンス

自分で一からライセンスを書いても、もちろん構いませんが、既に作成され公開されているライセンスを適用するのが普通です。

例えば次のようなライセンスがあります。

  • MIT License
  • Apache License 2.0
  • GNU General Public License v3.0

ライセンス関連の話は、本題から大きくそれるため詳しくは述べませんが、興味のある方は参考文献をご覧ください。

.gitignoreとは?

.gitignoreを使う場面

gitでファイルを管理していると「このファイルはgitで管理したくないな」と思う場面があります。

例えば、次のようなファイルです。

  • ソースコードをビルド(コンパイル)して出来た実行可能ファイル(~.exeなど)
    • ソースコードをビルドすれば、生成できるためわざわざgitで管理する必要がない
  • ビルドする時に一時的に作成されるファイル
    • これもビルドすれば生成される上に、わざわざ管理する必要がない
  • 個人的なメモ書き
    • 本当にただのメモ書きであれば、管理する必要もない

このような時.gitignoreという名前のファイルを置くと、ある特定のファイルを無視することが出来ます。

Column:Windowsで.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.txtbuildフォルダといった、ファイル名やフォルダ名のみを一つの行に書くと、その.gitignoreサブフォルダ以下にある全ての指定されたファイルやフォルダを無視します。(サブフォルダ以下です。.gitignoreが置かれている上のフォルダには、その.gitignoreの影響は及びません。)

……少しわかりにくいでしょうか?

一つ例を挙げましょう。
リポジトリの構成が下の図のようになっているとします。

例として挙げたリポジトリの構成

ここで、.gitignore

test

と書かれていたとします。すると、上の図のABが除外されることになります。
(フォルダが除外された場合、フォルダの中身のファイルも除外されます。)

名前の最後にスラッシュ(/)をつける

名前の最後にスラッシュをつけると、設定が書かれた.gitignoreサブフォルダ以下にある全ての指定されたフォルダのみを無視します。

例として挙げたリポジトリの構成

.gitignoreに、

test

と書いたときは、ABが無視されましたが

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超入門

www.atmarkit.co.jp

この連載では、gitをソフト開発で使いこなそうで扱えなかったGitHubの機能がいくつか解説されています。

う-ん、よく分からん!

この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。

参考文献

Pro Git

git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com

今日から始めるOSSライセンス講座

OSSライセンス、オープンソースソフトウェアライセンスについての概要が書かれている連載です。

thinkit.co.jp

文化庁著作権テキスト

https://www.bunka.go.jp/seisaku/chosakuken/seidokaisetsu/pdf/r1392388_01.pdfwww.bunka.go.jp

www.bunka.go.jp

OSSライセンスとは直接関係はありませんが、OSSライセンスの土台となっている「著作権」について詳しく学ぶことが出来ます。
文化庁が公式で出しているものです。

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp