Help us understand the problem. What is going on with this article?

.gitignoreでローカルにファイルを残しつつgitには上げない方法

この記事について

.gitignoreがどう動くのか、また何なのかを実際のBefore、Afterの状態をキャプチャして説明していきます。

モチベーション

.gitignoreを使用しないと、以下のようなことが起こる可能性があります。
- Git初心者が複数人で一つのアプリを開発する際、個々で毎回変わる設定ファイルを持つせいでマージする際にConflictが起きる
- Githubの無料アカウントを使用している場合に、全ファイルは公開されるため、サーバー情報を書いたファイルもGithubで公開されてしまう
そんな時に、この.gitignoreが大事であることに気づいたのでまとめようと思いました(今までは誰かが.gitignoreを常に作っていたので特に意識していなかったです。。)。

手順

単純に、ルートディレクトリ配下に、.gitignoreというファイルを作成し、そこにGithubに載せたくない、またはgitで追跡したくないファイルを指定します。その前に、ファイルを既にpushしてしまっている場合、git rm -r --cached ファイル名というコマンドで、gitから指定ファイルを除外します。

実装

CakePHPベースのアプリのtemp/cacheフォルダを除外します。

現状

image.png
しっかりcacheがGithubで確認できてます(本来ならアウト。。)。

Step1: git rm -r --cached ファイル名でgitから指定ファイルを除外

以下、実際の実行結果です。
image.png
git statusを見ると、しっかりuntrackされたように書かれています。
image.png

Step2: .gitignoreをルートディレクトリ配下に作成し、このtemp/cacheを無視するよう以下のように記述

以下、実際の実行動作です。
gitignore_1_demo.gif
自分の場合、既に.gitignoreを作成していたのですが、実行するコマンドは基本的には同じです。動画にあるように、最後に変更した内容をcommitしましょう。

Step3: git pushでGithubに反映

Pushします。以下、実際の実行結果です。
image.png

実装後

image.png
tmp/cacheフォルダがGithubで消えていることが確認できます。

一方ローカルでフォルダを見てみると、tmp/cacheフォルダが消えていないことが確認できます。つまりサーバー情報を載せたファイル等はローカルだけに保持するようなことができます。
image.png

追記

@htsignさんから指摘がありましたが、git rm -r --cached ファイル名では、最新のコミットからしかファイルが削除されません。なので、以下のように過去のコミット履歴をみると、削除したファイルが普通に存在してしまいます。
image.png
このファイル情報を見せたくない場合、git filter-branch等のコマンドで過去履歴からもファイルを削除する必要があります。
Git リポジトリに上がっているファイルを履歴ごと消すには?を参考に、実際に消してみます。
以下、実際の実行結果です。
image.png

次に、git gc --aggressive --prune=nowでレポジトリを最適化します。
image.png

このままPushすると、コミット情報にコンフリクトがあるせいか、断られます。
image.png

git push -fで強制的にPushします。
image.png
うまくいきました。
※チームで開発を行う場合、このような強制的な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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away