読者です 読者をやめる 読者になる 読者になる

女子WEBエンジニアのTechメモ

都内の某企業でマーケッターやってます。営業→WEBエンジニア・オフショア開発チーム駐在→マーケッター(SEO)ちょっと便利だなと思ったことをメモしています。

2年使ってるgitで初めてのエラーメッセージみた

使い始めてもうすぐ2年たつgitで、pullしようとしたらこんなエラーメッセージが。

Ajarakko@pjpj-web-staging:~/php_apps/pjpj/app (develop)
$ git pull origin develop
From ec2-XX-XX-XX-XXX.ap-northeast-1.compute.amazonaws.com:pjpj
 * branch            develop    -> FETCH_HEAD
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
Already up-to-date.


・・・ん?

Auto packing the repository in background for optimum performance.

なんぞこれ。

pull失敗してるのかな、と思いきや、Already up-to-dateだし、どうやら失敗してるようには見えない。

と不思議に思ったので調べてみました。

3秒で出来る解決方法(面倒くさがりな方向け)

面倒な解説はいらないから一刻も早く解決したいという人は、下記コマンドを実行して終わり。

git gc --auto

下記は、いろいろ調べてみたことをまとめてみます。興味ある方はご覧ください~

Auto packing the repository in background for optimum performanceとは

ちょっと調べてもピンとくるものがないので、とりあえず「git help gcしてくれや」と言われているgcコマンドを調べてみる。

git gc コマンドは

Git は時々 "auto gc" と呼ばれるコマンドを自動的に実行します。大抵の場合、このコマンドは何もしません。もし沢山の緩いオブジェクト(パックファイルの中にないオブジェクト)があったり、あまりに多くのパックファイルがあると、Git は完全な(full-fledged)git gc コマンドを開始します。

Git - メインテナンスとデータリカバリ

ほーん。何もしないことはわかったけど、イマイチピンと来ない。

gcとは、garbage collectの略だそうです。つまりゴミ収集。

で、このgit gcコマンドを実行すると、下記のことが起こります。

  1. まず、すべての緩いオブジェクトを集めてそれらをパックファイルの中に入れます。
  2. 複数のパックファイルをひとつの大きなパックファイルに統合します。
  3. どのコミットからも到達が不可能なオブジェクトや数ヶ月の間何も更新がないオブジェクトを削除します。

つまり、不要そうなオブジェクトを削除してくれるのが、git gcというコマンドなんです。

通常であれば自動で行ってくれることなんですが、この不要なオブジェクトが溜まっていたために「手動でお掃除してくださいね」と言われていた模様。

ちなみに自動で実行されるタイミングはこちら。

約 7,000個もの緩いオブジェクトがあるか、または50以上のパックファイルがないと、Gitは実際に gc コマンドを開始しません。

こういったリミットは、設定ファイルの gc.auto と gc.autopacklimit で変更することができます。

というわけでgit gcしてみる

公式サイトで言われているように、git gc --autoしてみた。

Ajarakko@pjpj-web-staging:~/php_apps/pjpj/app (develop)
$ git pull origin develop
From ec2-XX-XX-XX-XXX.ap-northeast-1.compute.amazonaws.com:pjpj
 * branch            develop    -> FETCH_HEAD
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
Already up-to-date.
Ajarakko@pjpj-web-staging:~/php_apps/pjpj/app (develop)
$ git gc --auto
Ajarakko@pjpj-web-staging:~/php_apps/pjpj/app (develop)
$ git pull origin develop
From ec2-XX-XX-XX-XXX.ap-northeast-1.compute.amazonaws.com:pjpj
 * branch            develop    -> FETCH_HEAD
Already up-to-date.

なおった!

調べてもよくわからなかった

調べてみたのですが、まだ良くわからないことが2つ。。。

  • gcコマンドは自動で実行されるはずなのに、なんで今回手動でやってねメッセージが出てきたの?
  • どのコミットからも到達が不可能なオブジェクトって何?そんなの存在するの?

 ツリー型のオブジェクトならそんなオブジェクトなさそうなのに。少なくとも初回のコミットにひも付きそう。

詳しい方いたら教えてください。゚(゚^ω^゚)゚。