どんな問題
開発中のアプリで、bundle install実行後、GitHub Desktop上でコミットをプッシュしようとしたところ、次のようなエラーが発生。
エラー文を見てみると、
Commit failed -exit code 1 recerved with output: 'User/~~~
Argument list too long'
と表示されています。
注目するのは「Argment list too logn」の部分です。これは「コマンドへ渡す引数の数が多すぎです」という意味です。(ファイルが7000個以上もコミット対象に上がっている・・・)
✅ Gemfile
✅ Gemfile.lock
✅ vendor/bundle/ruby/2.6.0/bin/byebug
✅ vendor/bundle/ruby/2.6.0/bin/coderay
✅ vendor/bundle/ruby/2.6.0/bin/geocode
✅ vendor/bundle/ruby/2.6.0/bin/kisten
・
・
・
こんな感じで、bundle installでインストールしたgemがvendorディレクトリ内に保存されていることがわかります。
前提条件
macOS 10.15.4
ruby 2.6.5
発生した経緯
前回のbundle install時に
% bundle install --path vendor/bundle
こちらのコマンドを入力してしまっていたことが原因で、venderディレクトリ内のbundleディレクトリにgem関係が格納されてしまったから、だと思われます。
対処
①vendorのbundleディレクトリを手動で削除する。
bundle install --path vendor/bundleを実行後、vendorディレクトリ内にbundleディレクトリが作成されるので、それを手動で削除します。
この、「bundle/ruby/2.6.0」指定して、まるっと削除します。
②BUNDLE_PATHを修正する(削除する)
bundle install --path vendor/bundlekコマンド入力後、
下の画像の通り、.bundleディレクトリのconfigファイルにvendorへのBUNDLE_PATHに書き換えられてしまいます。
こちらのBUNDLE_PATH: "vendor: 'vendor/bundle"をまるっと削除します。
削除後は下のようになります。
③vendorを.gitignore内に記述し、bundleをvenderに入れないように設定する。
最後に、今後vendorのbundle内にファイルを入れないように、.gitignoreファイル内に以下の記述を追加します。
vendor/bundle
この記述を行い、vendor/bundleをコミット対象から除外するように設定します。
④改めてbundle installを行う
最後に、改めてbundle installを行ってみます。
% bundle install
vendor/bundle内のファイルがコミット対象から外れ、コミットエラーが解消されます。
最後に
今回のエラーの発端は bundle install時に --path vendor/bundle とpathを指定してしまっていたことです。
pathの指定をすべきか?orしなくても良いか?という議論はあるみたいですが、基本的に指定しなくても問題ないみたいです。(特定の条件の場合は問題が生じるためpathを指定しないといけない場合もあるみたいです。)
こちらの記事が参考になります。
(Qiita)bundle install時に--path vendor/bundleを付ける必要性は本当にあるのか、もう一度よく考えてみよう
https://qiita.com/jnchito/items/99b1dbea1767a5095d85#201967%E8%BF%BD%E8%A8%98-%E9%80%86%E3%81%ABpath%E3%82%92%E4%BB%98%E3%81%91%E3%81%AA%E3%81%84%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A3%E3%81%A6%E4%BD%95%E3%81%8B%E3%81%82%E3%82%8B%E3%81%AE
以上、最後まで見ていただきありがとうございました。(間違い等ございましたらご指摘いただけますと助かります!)
参考文献
https://teratail.com/questions/283421
https://techacademy.jp/magazine/10179