【git】後からgitignoreに追加したファイルがリモートレポジトリで反映されていない場合の解決方法


投稿日 2022年6月9日 >> 更新日 2022年6月9日

概要

gitignoreファイル内の追記ミスや後々除外したくなったファイルをリモートレポジトリに反映(除外)されるようにgitプロジェクトに追加されたキャッシュファイルを削除します。

実行環境

実行環境
Windows Subsystem for Linux
git version 2.17.1

gitignoreを適用させる例

gitignore前のレポジトリ例

下図のリモートレポジトリには、2つのファイルが追加されています。一方は公の場でも見せられる「public.txt」というファイル、もう一方は個人用の「private.txt」というファイルで、追加したもののやっぱり除外しておきたいという状況にいます。

gitignoreの作成

ローカルレポジトリにて追加で新たに除外リストを記載した「gitignore」ファイルを作成し、リモートレポジトリにプッシュ(送信)します。

$ echo 'private.txt' > .gitignore
$ git add .gitignore
$ git commit -m 'gitignoreの作成'
[main f639e08] gitignoreの作成
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore
$ git push
Username for 'https://github.com': ユーザー名
Password for 'https://user-name@github.com':アクセストークン
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 327 bytes | 81.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/user-name/ignore-repo.git
   e37b430..f639e08  main -> main

しかし後から除外リストに記載したファイルは適用(反映)されていないことが分かります。

コミットされているキャッシュファイルを削除する

gitプロジェクトのログを見てみると、これまでのコミット履歴を参照できます。

※「--name-only」オプションを付けるとファイル名も出力します

$ git log --name-only
commit f639e0858ffc96031f0ea20e3830663abb7933d5 (HEAD -> main, origin/main)
Author: User-Name <address@gmail.com>
Date:   Thu Jun 9 11:19:31 2022 +0900

    gitignoreの作成

.gitignore

commit e37b43010582918be6a609136453a15af5c96ab6
Author: User-Name <address@gmail.com>
Date:   Thu Jun 9 08:42:14 2022 +0900

    first commit

private.txt
public.txt

上から新規作成した順に並んでおり、gitignoreを作成する以前より作成されたファイル群はキャッシュファイルとして存在しているため、レポジトリに反映させるには除外したいファイルのキャッシュを削除する必要があります。

※「--cached」オプションは実際のファイルを削除するのではなく、キャッシュファイルを削除します

$ git rm --cached private.txt
rm 'private.txt'
$ ls
private.txt  public.txt
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    private.txt

ワーキングディレクトリには「private.txt」はありますが、「git status」コマンドでその時点でのレポジトリの状態を確認してみると削除されていることがわかります。

これを「git commit」として確定するだけでgitの管理下から除外されます。

$ git commit -m 'キャッシュファイルの削除'
[main 5e95a97] キャッシュファイルの削除
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 private.txt
$ git log --name-only
commit 5e95a97ddd31a7973bad161262293efcb699359f (HEAD -> main)
Author: User-Name <address@gmail.com>
Date:   Thu Jun 9 12:07:55 2022 +0900

    キャッシュファイルの削除

private.txt

commit f639e0858ffc96031f0ea20e3830663abb7933d5 (origin/main)
Author: User-Name <address@gmail.com>
Date:   Thu Jun 9 11:19:31 2022 +0900

    gitignoreの作成

.gitignore

commit e37b43010582918be6a609136453a15af5c96ab6
Author: User-Name <address@gmail.com>
Date:   Thu Jun 9 08:42:14 2022 +0900

    first commit

private.txt
public.txt

問題無くプッシュ(送信)できればリモートレポジトリに反映されているかと思います。

$ git push
Username for 'https://github.com': ユーザー名
Password for 'https://user-name@github.com':アクセストークン
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 266 bytes | 266.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/user-name/ignore-repo.git
   f639e08..5e95a97  main -> main

それでは以上です。

最後までご覧いただきありがとうございました。