GitLabにGitリポジトリを作成して利用しているが、ある時git cloneができなくなって困ったので対処方法をメモしておく。
[エラー概要]
なぜか巨大なバイナリファイルが入ってしまっているGitリポジトリがGitLab上にあった。
これをJenkinsのビルドジョブの中でクローンしようとしたところ、以下のようなエラーが発生した。
$ git clone https://my-gitlab-url/my-repository.git
fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed
[解決策候補]
Google先生に「fatal: index-pack failed」についてたずねると、いくつか解決策があるようだった。
Git一般の解決策としては以下の3つがあるようだ。
1.gitのhttp通信制限を増やす 2.サーバー側でgc&repackする 3.そもそも一度にcloneする量を減らす
http通信制限を増やしたがエラー内容は変わらなかった。
サーバー側で、つまりはGitLab側でgc&repackについては、実施しようと試みたが、オンプレ版GitLabをセットアップした人が捕まらず、gitのサーバー側の設定がわからずこれは実施に至らなかった。そのため効果は不明である。
以前に同じリポジトリをローカルのマシンにクローンした際は、3で上手くいったのを覚えている。今回も同じように対応しようとしたが、リポジトリに含まれるファイルサイズが大きくなったせいか、git clone --depth 1 https://my-gitlab-url/my-repository.git
でも上手くいかなかった。
さらに検索を進めると、GitLabのタイムアウト時間を延長する方法があることが分かった。
GitLabのサーバー上で、/etc/gitlab/gitlab.rb
ファイルを編集する。タイムアウトのデフォルト値は30秒らしいので、以下のように60秒に設定した。
unicorn['worker_timeout'] = 60
このままgit clone
を実行するとやはりエラーが出る。GitLabの設定反映を行う必要があった。
https://docs.gitlab.com/ee/administration/restart_gitlab.html
GitLabのサーバー上で以下のコマンドを実施し、設定を反映させる。
sudo gitlab-ctl reconfigure
しかしエラー内容が変わらない……。
[This worked for me]
さらに調査を進めると、以下のページを見つけた。
タイムアウトの設定値を600にしたら上手くいった、と。
このコメントを信じて再度設定を行う。GitLabのサーバー上で、/etc/gitlab/gitlab.rb
ファイルを編集する。
unicorn['worker_timeout'] = 600
編集が終わったら、GitLabのサーバー上で以下のコマンドを実施し、設定を反映させる。
sudo gitlab-ctl reconfigure
これで無事Jenkinsのビルドジョブでgit clone
を実行することができた。
ただし今回の方法では解決しないケースもある模様。奥が深い……。
[まとめ]
GitLabでgit cloneできないときは以下のどれかが効く、かも。
- git config --global http.postBuffer 524288000
- git gc && git repack -a -f -d --window=250 --depth=250
- git clone --depth 1 https://my-gitlab-url/my-repository.git
- unicorn['worker_timeout'] = 600 # /etc/gitlab/gitlab.rbファイル内