カテゴリー
コンピューター

【Git】追跡対象としてきたファイルを .gitignore に記述しても反映されない問題の対処方法

問題の内容

今まで Git でバージョン管理してきたファイルのいくつかを、.gitignore に記述し、コミットいたしました。

次に、.gitignore に追記したファイルを編集いたしました。

そうしてから git status で状態を確認してみますと、modified と表示され、つまりは追跡対象ファイルとして扱われてしまっておりました><。

解決のポイント

  • 今まで追跡してきたファイルを .gitignore に追記してコミットしただけでは追跡対象外とならない。
  • .gitignore に記入すると同時に、追跡対象外としたファイルをインデックスから削除する必要がある。
  • 「ファイルをインデックスから削除」を実行した時点で、削除した状態がインデックスに記録される。したがって削除した内容を git add する必要はない。

手順概要

  1. .gitignore に追跡対象外とするディレクトリ・ファイルを指定
  2. 追跡対象外とするディレクトリ・ファイルをインデックスから削除
  3. gitignore をインデックスに追加し、コミット

コマンド

# 追跡対象外のファイル一覧を表示
# --full-name: プロジェクトのトップディレクトリからのパスで表示
# --ignored: 追跡対象外のファイルを表示
# --exclude-standard: .gitignore、.git/info/exclude にあるパターンに一致するファイルを表示
git ls-files --full-name --ignored --exclude-standard
# 追跡対象外となるファイルをインデックスから削除(作業ディレクトリのファイルには影響なし)
git rm --cached `git ls-files --full-name --ignored --exclude-standard`

実践

$ # .gitignore を編集して追跡対象外ファイルを追加した。
$ # 追跡対象外となるファイルをインデックスから削除
$ git rm --cached `git ls-files --ful-name --ignored --exclude-standard`
rm 'app/config/databases.php'
rm 'app/config/mongodb.php'
$ # .gitignore をインデックスに追加
$ git add .
$ git status -sb
## master
A .gitignore
D app/config/databases.php
D app/config/mongodb.php
$ git commit
[master eb08c36] 設定ファイルを管理から外す
3 files changed, 25 insertions(+), 109 deletions(-)
create mode 100644 .gitignore
delete mode 100644 app/config/databases.php
delete mode 100644 app/config/mongodb.php
$

追跡対象外操作完了後の git checkout <tree-ish> — <paths> に注意

以上の追跡対象外にする作業後に、git checkout <tree-ish> -- <paths> を行うと、.gitignore に記されたファイルであってもコミット対処ファイルとしてステージングされてしまいました><。

したがって、git reset をする必要がございました。

一度インデックスから削除しましたら、その後は追跡対象となりませんでしたわ♪

git checkout v1.0 -- app/config/databases.php app/config/mongodb.php
$ # コミット対象ファイルとしてステージングされてしまった。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
  
        new file:    app/config/databases.php
        new file:    app/config/mongodb.php

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:    app/config/databases.php
        modified:    app/config/mongodb.php

$ # 一度インデックスから削除すれば、その後は追跡対象とならない。
$ git reset .
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
$

おわりに

参考になりましたページです。ありがとう存じます!

以上です。

コメントを残す