後から追加した.gitignoreでgit管理対象から除外するのに苦労した話

.gitignoreを設定する際の注意点と対処方法についてご紹介します
2023.03.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。ネクストモード株式会社 の倉地です。
普段はTerraformのコードをGitHubで管理しているのですが、ブログのタイトルの通り.gitignoreの使い方で少し躓いた経験をしましたのでその内容と対処方法をご紹介します。

事象

Git環境の準備からトラブルに至るまでを時系列で記載していきます。

GitHubの準備

ローカル上のnm-test-repositoryディレクトリ内に、Terraformで使用するコードを保管しています。
こちらをリモートリポジトリであるGitHubにプッシュすることが今回のゴールとなります。
※事前にGitHub上にnm-testというリモートリポジトリを用意しておきます

下記の手順でnm-test-repositoryにGit環境を用意していきます。

$ git init
Reinitialized existing Git repository in /home/nm-user/work/nm-test-repository/.git/

$ git add .

$ git commit -m "first commit"
[main (root-commit) 7c53323] first commit
 6 files changed, 219 insertions(+)
 create mode 100644 .terraform.lock.hcl
 create mode 100755 .terraform/providers/registry.terraform.io/hashicorp/aws/4.60.0/linux_amd64/terraform-provider-aws_v4.60.0_x5
 create mode 100644 .terraform/terraform.tfstate
 create mode 100644 provider.tf
 create mode 100644 variable.tf
 create mode 100644 vpc.tf

$ git remote add origin https://github.com/nm-test/nm-test-repository.git

GitHubへのプッシュに失敗

Gitの準備が整ったのでgit push origin mainでリモートリポジトリにプッシュしたところ、下記のようなエラーが出ました。
GitHubはファイル当たりのサイズは100MBまでのため、今回プッシュを試みた.terraformディレクトリ配下のファイルサイズが大きすぎたことが原因です。

$ git push origin main
Username for 'https://github.com/nm-test/nm-test-repository.git': nm-test-token
Password for 'https://nm-test-token@github.com/nm-test/nm-test-repository.git': 
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 73.90 MiB | 3.47 MiB/s, done.
Total 15 (delta 0), reused 0 (delta 0), pack-reused 0
remote: error: Trace: 253872f852edcd4d924a1b52a952a63621ba1421762d0670eb954dbe81f1ddfa
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File .terraform/providers/registry.terraform.io/hashicorp/aws/4.60.0/linux_amd64/terraform-provider-aws_v4.60.0_x5 is 331.69 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
To https://github.com/nm-test/nm-test-repository.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/nm-test/nm-test-repository.git'

.terraformディレクトリ配下をGitの管理外とするため、.gitignoreを設定します。
.gitignoreとはGitで使われる特殊なファイル名で、このファイルに書かれたファイルやディレクトリはGitのトラッキングの対象外になります。

nm-test-repositoryディレクトリ配下に下記の内容で.gitignoreファイルを作成しました。

# Local .terraform directories
**/.terraform/*

.gitignoreファイルを保存し、改めてプッシュの準備をしていきます。

$ git add .
$ git commit -m ".gitignore追加"

再度GitHubにプッシュしましたが、やはりファイルサイズの制限に引っ掛かりプッシュすることができませんでした。
.gitignoreファイルを用意して.terraformディレクトリをGitの管理対象外として設定したのになぜでしょうか。

$ git push origin main
Enumerating objects: 18, done.
Counting objects: 100% (18/18), done.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (18/18), 73.90 MiB | 3.45 MiB/s, done.
Total 18 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
remote: error: Trace: a17c36s6262ds02s30s046f5c99sa7d7694d68s4s1026fbeab1cs7f213essd99
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File .terraform/providers/registry.terraform.io/hashicorp/aws/4.60.0/linux_amd64/terraform-provider-aws_v4.60.0_x5 is 331.69 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
To https://github.com/nm-test/nm-test-repository.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/nm-test/nm-test-repository.git'

原因と対処方法

結論から言うと最初のコミット後に.gitignoreを追加した場合、対象外としたいディレクトリ(.terraform)がGitの履歴に残ってしまっているためにGitの管理対象から除外されないことが原因でした。
そのため最初のコミット後に.gitignoreを追加する場合は、Gitの履歴を削除した上で改めてプッシュする必要があります。
下記のコマンドを叩き、Gitの履歴から対象外としたいディレクトリ(.terraform)を削除します。

$ git filter-branch -f --index-filter 'git rm --cached -r --ignore-unmatch .terraform/'

サイズ制限に引っ掛かることなく無事にプッシュできました。

$ git push origin main
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (13/13), 2.69 KiB | 393.00 KiB/s, done.
Total 13 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/nm-test/nm-test-repository.git
 * [new branch]      main -> main

さいごに

今回はGitHubを使用する上で、.gitignoreの注意点と対処方法ついてご紹介しました。もちろん最初のコミットの前から.gitignoreファイルを用意しておけばよいのですが、うっかり用意せずにコミットしてしまった場合は上記の手順で対処いただければと思います。 この記事がどなたかのお役に立てば幸いです。

参考記事

100MBを超えるファイルを間違えてコミットしてgit pushできない、、

ネクストモードについて

ネクストモード株式会社は東日本電信電話株式会社とクラスメソッド株式会社で設立したクラウドカンパニーです。 「クラウドであたらしい働き方を」というメッセージを掲げ、さまざまなクラウド技術や製品を組み合わせて企業の働き方の当たり前を変えていくことを目指しています。 クラウドやSaaSのご利用に関してお困りごとがあれば、ネクストモードまでぜひお問い合わせください。