#この記事について
.gitignoreがどう動くのか、また何なのかを実際のBefore、Afterの状態をキャプチャして説明していきます。
#モチベーション
.gitignore
を使用しないと、以下のようなことが起こる可能性があります。
- Git初心者が複数人で一つのアプリを開発する際、個々で毎回変わる設定ファイルを持つせいでマージする際にConflictが起きる
- Githubの無料アカウントを使用している場合に、全ファイルは公開されるため、サーバー情報を書いたファイルもGithubで公開されてしまう
そんな時に、この.gitignore
が大事であることに気づいたのでまとめようと思いました(今までは誰かが.gitignore
を常に作っていたので特に意識していなかったです。。)。
#手順
単純に、ルートディレクトリ配下に、.gitignore
というファイルを作成し、そこにGithub
に載せたくない、またはgit
で追跡したくないファイルを指定します。その前に、ファイルを既にpushしてしまっている場合、git rm -r --cached ファイル名
というコマンドで、gitから指定ファイルを除外します。
#実装
CakePHPベースのアプリのtemp/cache
フォルダを除外します。
###現状
しっかりcache
がGithubで確認できてます(本来ならアウト。。)。
###Step1: git rm -r --cached ファイル名
でgitから指定ファイルを除外
以下、実際の実行結果です。
git status
を見ると、しっかりuntrackされたように書かれています。
###Step2: .gitignore
をルートディレクトリ配下に作成し、このtemp/cache
を無視するよう以下のように記述
以下、実際の実行動作です。
自分の場合、既に.gitignore
を作成していたのですが、実行するコマンドは基本的には同じです。動画にあるように、最後に変更した内容をcommit
しましょう。
###Step3: git push
でGithubに反映
Pushします。以下、実際の実行結果です。
###実装後
tmp/cache
フォルダがGithubで消えていることが確認できます。
一方ローカルでフォルダを見てみると、tmp/cache
フォルダが消えていないことが確認できます。つまりサーバー情報を載せたファイル等はローカルだけに保持するようなことができます。
#追記
※@htsignさんから指摘がありましたが、git rm -r --cached ファイル名
では、最新のコミットからしかファイルが削除されません。なので、以下のように過去のコミット履歴をみると、削除したファイルが普通に存在してしまいます。
このファイル情報を見せたくない場合、git filter-branch
等のコマンドで過去履歴からもファイルを削除する必要があります。
Git リポジトリに上がっているファイルを履歴ごと消すには?を参考に、実際に消してみます。
以下、実際の実行結果です。
次に、git gc --aggressive --prune=now
でレポジトリを最適化します。
このままPushすると、コミット情報にコンフリクトがあるせいか、断られます。
git push -f
で強制的にPushします。
うまくいきました。
※チームで開発を行う場合、このような強制的なPushを行うかは、慎重に検討しましょう。
#最後に
以上、.gitignore
の動きについてまとめました。
#参考:
https://qiita.com/y_minowa/items/e3d8513dc31c1b378e0d
https://qiita.com/go_astrayer/items/6e39d3ab16ae8094496c
https://stackoverflow.com/questions/6403601/purging-file-from-git-repo-failed-unable-to-create-new-backup