##.gitignoreとは
.gitignore
ファイルを作成し、ファイルやディレクトリを指定することでgitの管理から外すことができる。.log
ファイルなど、管理する必要はないけどファイルサイズが大きいものとかに適用させる。
##詰まったところ
dotinstallのgit入門「#09_git管理に含めない設定」において、作業ディレクトリに
index.html
error.log
がある状態で.gitignore
を作成し、git status
で確認すると、.log
ファイルが消えて.gitlgnore
ファイルしかgit
が管理対象として識別していませんねと説明。
動画通りだと
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
nothing added to commit but untracked files present (use "git add" to track)
となる予定だったけど、実際自分が行ってみると
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: error.log
# modified: style.css
#
no changes added to commit (use "git add" and/or "git commit -a")
おい、認識されてるじゃねーか・・・
どういうこっちゃとなった訳ですよ。
(ちなみにstyle.cssはなんとなく作ったので無視しておけ)
##現状を整理
まず動画で行なっている手順を簡単にまとめてみると
- 今まで編集していた
index.html
とは別に、新たにerror.log
を作成(vi
コマンドで) -
git status
で確認すると(動画内では確認してないけど)新たに作成されたerror.log
がまだステージングエリア(インデックス)にadd
されてないよと表記される(予定)。 - そこで
.gitignore
を作成し、拡張子.log
のファイルはすべて無視するように
*.log
と編集し、保存(i
で挿入モード - *.log
と入力 - escキー - :wq
で上書き保存)。
4.git status
で確認すると、先ほど作成したerror.log
が表示されなくなり、代わりに.gitignore
のみ表示されるようになりましたね。
-> つまりgit
が.error.log
を管理対象から外していることがわかりますねという感じ
##原因
上で表記した通り、動画内では、新たに作成したファイル(addもcommitもしてない)に対して.gitignore
を作成してgit status
を確認すると.log
のファイルが表示されなくなったよと説明していた。
それに対して自分の場合、「#08_gitでのファイル操作について」のレッスンにおいて、今いるディレクトリより下の階層にある作成・編集したすべてのファイルをステージングエリア(インデックス)にあげるgit add .
の動きを確認するため、今までindex.html
しか扱っていなかったが、新たにstyle.css
とerror.log
を作成し、git add .
を確認してそのまま次のレッスンに進んでしまっていた。
-> つまり勝手なことをしたことによる自爆ですね。
dotinstallの動画ではgit add .
による動きを口頭のみで説明したので、動画通りに進めていたらディレクトリ内にはindex.html
しかないため、本レッスンでerror.log
を作成した状態で進めていれば動画通りに動くよということでした。
そう考えると、自分の出てきた画面を見てみると
# modified: error.log
# modified: style.css
思いっきりmodified
(修正されましたよ)と書かれてましたね。
リポジトリにcommit
済みであることを証明しています・・・
動画通りに進めていたら、error.log
を作成後にgit status
を入れると
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# error.log
# style.css
こんな感じになったのかなと思います。
##疑問
でもそうなると、add
もcommit
もしていないファイルにしか.gitignore
って適用できないの?と思ったので、自分のような状況でも.gitignore
を適用させる方法がないかちょっと調べてみました。(てかできなったらほとんど意味ないけど)
##解決策
.gitignore
には大きな特徴があるみたいで、設置した際にすでにリポジトリに登録してあるファイルに対しては記述しただけではgitの管理から外すことができないみたいです。その場合、一度リポジトリから無視したいファイルを管理対象から外すという処理が必要ということ。
以下のコマンドでリポジトリから対象ファイルを管理対象から外すことが可能です。
$ git rm --cached 対象のファイル(今回だとerror.log)
ここで1つ注意点として、--cached
は絶対につけるようにしてください!
--cached
をつけないとリポジトリからファイルを丸ごと削除してしまいます!
--cached
をつけることで、リポジトリからファイルを削除せず、管理対象から外すだけとなるのでご注意を!
つまり今回の状況だと
1.リポジトリから管理対象を外すためにgit rm --cached error.log
を実行
2.git status
でerror.log
が管理対象から外れているかチェック
-> deleted: error.log
となっていれば管理対象から外れている
3.git commit
で管理対象から外したという変更をリポジトリに適用させる
4.git status
で変更が適用されていることを確認
-> deleted: error.log
が消えていればおけ
5..gitignore
を作成
6..git status
で確認すると、.log
ファイルが表示されずに.gitignore
のみが表示されることがわかる。
7.git
の管理下にあるファイルにも適用させるために、.gitignore
をadd
、commit
させることでgit管理下ファイルにも適用させることが可能となる
-> ここは主に複数人での作業で全員に適用させたい場合などに用いる
もちろん.log
のみではなくて、複数のファイルを同時に登録しておき、管理外にさせることも可能なので、その場合に応じて適応させると良いと思います。
##最後に
.gitignore
を調べている間にいくつかの便利な情報を知ることができたので、忘れないうちに記載しておきます。
$ git ls-files
-> 現在gitが管理しているファイルおよびディレクトリを一覧で表示してくれる
$ git log
-> gitにコミットさせた履歴を一覧として表示(基本中の基本ですが、忘れてた)
$ git log --stat
-> gitにコミットした履歴と、ファイルの変更箇所も同時に表示
##参考文献
先人様の知恵に感謝です。むしろこちらの方がより詳しく記載されています。
- http://sutara79.hatenablog.com/entry/2015/07/21/115842 (.gitignoreについて)
- http://qiita.com/yuuAn/items/b1d1df2e810fd6b92574 (.gitignoreについて)
- http://qiita.com/megu_ma/items/a438a71c84145f14d04e (git rm --cached)