Git管理中のファイルを .gitignore で管理対象外にする方法を整理する
すでに Git 管理されているファイルに .gitignore が効かない理由と、git rm --cached で今後の管理対象から外す方法を整理する
今日やったこと
- すでに Git 管理されているファイルを、あとから
.gitignoreに追加した場合の挙動を確認した .gitignoreは、基本的にまだ Git 管理されていないファイルに対して効くことを確認した- Git 管理中のファイルを、ローカルには残したまま今後の管理対象から外す方法を確認した
git rm --cachedの使い方を整理した
例として、すでに hoge.txt が Git 管理されている状態を考えた。
git add hoge.txt
git commit -m "Add hoge.txt"
このあとで .gitignore に hoge.txt を追加しても、hoge.txt は Git 管理されたままになる。
hoge.txt
そのため、hoge.txt を変更すると、通常どおり git status に表示される。
echo "追記" >> hoge.txt
git status
すでに Git 管理されているファイルを、今後の管理対象から外したい場合は、次のようにする。
git rm --cached hoge.txt
git add .gitignore
git commit -m "Stop tracking hoge.txt"
--cached を付けることで、Git の管理対象からは外すが、ローカルの hoge.txt は削除しないようにできる。
学んだこと
.gitignoreは、未追跡のファイルを Git 管理対象にしないための設定- すでに Git 管理されている tracked なファイルには、あとから
.gitignoreに追加しても効かない - tracked なファイルは、
.gitignoreに書いてあっても変更するとgit statusに表示される - tracked なファイルは、
.gitignoreに書いてあってもgit addやgit commitができる - 今後 Git 管理対象から外したい場合は、
.gitignoreに追加するだけでは足りない - ローカルファイルを残したまま Git 管理から外すには、
git rm --cachedを使う
git rm --cached hoge.txt は、次のような意味になる。
Git のインデックスから hoge.txt を削除する
作業ディレクトリ上の hoge.txt は残す
次回以降は .gitignore により無視される
一方で、次のように --cached を付けずに実行すると、ローカルファイルも削除される。
git rm hoge.txt
そのため、ローカルにはファイルを残したい場合は、必ず --cached を付ける必要がある。
今回のポイントは、次のとおり。
.gitignore に書いたからといって、
すでに Git 管理されているファイルが自動で管理対象外になるわけではない。
あいまいなこと
git rm --cachedしたファイルを他の人が pull した場合、相手の作業ツリー上でファイルがどう扱われるのか- チーム開発で設定ファイルを管理対象外にするとき、どのタイミングで周知すべきか
- 過去の履歴からもファイルを削除したい場合に、どの方法を使うべきか
次にやること
- 誤ってコミットしたファイルを、Git の履歴から削除する方法を整理する
git filter-repoや BFG Repo-Cleaner のような履歴書き換えツールについて調べる