0

私は自分のコミットをアップストリームにプッシュする前にチェックするのが好きなので、コミットする前に常にgitk(ちょっとしたビジュアルが好きです) を実行します。ただし、最初にコードをコミットしてから gitk を実行する方がはるかに高速であることに気付きました。

もっとゆっくり:

  1. [コミットされていない変更あり]
  2. gitk
  3. コミットされていない変更を確認する

かなり速い: (時間測定はしていませんが、数秒の遅れとは対照的に、瞬時のようです)

  1. gitコミット
  2. gitk
  3. 最後のコミットを確認する
  4. 必要に応じて元に戻すか修正します。

私の理解では、gitコミットを作成するときに基本的に差分を実行します。では、最後のコミットをコミットしてレビューするよりも、コミットされていないコードを比較するのに時間がかかるのはなぜでしょうか?

4

1 に答える 1

2

私の理解では、git は基本的に、コミットを作成するときに diff を実行します。

少なくとも、それは真実ではありません。コミットするとき、Git は単に現在のインデックスをそのまま正確にアーカイブします。コミットには差分はありません。むしろ、コミットを実際に表示するたびに動的に生成されます。

したがって、ある意味では、あなたも間違った考えを持っています。で最後のコミットを表示するとgitkgitk実際に実行git diffされて、表示されているものが生成されます。そのため、それほど遅くない場合は、git diff単に遅くはありません。:)

現在の作業ツリーの差分を作成するのが遅い場合、それは何よりもファイルシステムに問題があると思われます。遅いと感じたことは一度もありませんし、NFS も使用しています。(したがって、ファイルシステムがそれよりもはるかに遅くなる方法をよく理解していないことを認めなければなりません。)

gitkまたは、ビットが遅いだけかもしれません。リポジトリの現在の状態を確認するためにあまり使用したことはありません。通常はgit statusgit diffおよび/またはgit gui代わりに使用します。(私は を使用しますgitkが、ほとんどは履歴および/または履歴コミットを表示するためだけです。)

いくつかのヒント:

  • gitk毎回再起動するのではなく、バックグラウンドで実行したままにします。
  • 実行git diff自体が開始と同じくらい遅いかどうかを確認しgitkます。
  • 念のため、a を実行しgit gcてリポジトリを最適化します。

編集: Windows 7 を使用していると述べたので、Linus が Git の設計についてコメントする際に引用したことを言及する必要があります。 Gitの。したがって、作業ツリーとインデックスの比較が遅い理由は、Windows 7 のファイルシステム呼び出しが Linux よりも遅いか、Git がファイルシステムを使用する方法が単に気に入らないためかもしれません。

Git メーリング リストのこのスレッドは、あなたが抱えている問題と同じようですが、さらに悪いことです。とりわけ、この引用があります:

単純な現実として、Git は stat が安価であるという前提で書かれており、Windows では実際にはそうではなく、ファイルシステムのキャッシュがこれでうまく機能していないように見えるということだと思います。

SO に関するこの回答では、Windows でのパフォーマンスを劇的に向上させる msysgit のパッチについて言及しています。

于 2014-02-11T23:25:15.703 に答える