Gitステータスが完了するまでに長い時間がかかる


85

私はgitWindowsマシンのローカルディレクトリ内のファイルを管理するために使用しています-ここにはネットワークは含まれていません。別のマシンとの間でプッシュまたはプルしていません。私のディレクトリにはおそらく100個のファイルがあり、すべてのテストファイルはかなり小さいです。実行するとgit status、完了するまでに通常20〜30秒かかります。これは正常ですか?それをスピードアップするために私ができることはありますか、または私のリポジトリの状態(変更されたファイル、追跡されていないファイルなど)を確認するためのより良い方法はありますか?他のgitコマンドははるかに速く完了するようです。


どのgitバージョンを使用していますか?msysGit Googleグループまたはgitメーリングリスト(git [at] vger.kernel.org、サブスクライブする必要はありません)のいずれかで助けを求めることを検討してください。おそらく、これはgitのバグです。
ヤクブNarębski

回答:


129

git gcを試しましたか?これにより、gitリポジトリからがらくたが削除されます。


3
これでうまくいったようです。ほんの数回のコミットの後、リポジトリにクリーンアップできるものがたくさんあることに私は非常に驚いています-ありがとう!
Matt McMinn

4
Hehe、コマンドをgit status使用して実行したtimeところ、30.464秒の「実際の」時間が得られました。その後git gctime git statusもう一度走って、35.409秒のリアルタイムを取得しました。かなり奇妙です。
RyanScottLewis 2011年

14
これにより、ほとんどのリポジトリで33秒から1秒未満に修正されました。あなたがそのポイントに到達し始めたときにGitがこれを行うようにあなたに言うならそれは素晴らしいでしょう。私はそれが必要だとは知りませんでした。
XP84 2013年

git status連続して複数回実行する場合、後続の実行は最初の実行のほんの一部しかかかりません。あなたが実行しているのであれば、git statusし、git gcその後、git status再び、超迅速な実行が期待されます。
kiewic

7

同様の問題で、既存のgitリポジトリの下のディレクトリにgitリポジトリがあると、大幅な速度低下が発生することがわかりました。

セカンダリgitリポジトリを別の場所に移動しましたが、速度が速くなりました。


同様の問題を追加します。何が起こったのかは、サブディレクトリでgitinitを実行したことです。その問題は、サブディレクトリが隠されていることです(変更を確認するには、内部でgit statusを実行する必要があります)が、gitはまだそれらを計算しようとしていると思います。サブディレクトリを無視し、すべてが正常になりました。
mb14 2013

6

ある種のウイルス対策ソフトウェアを使用していますか?多分それは物事を妨害しています。git何千ものファイルのリポジトリを持つウィンドウでは、私にとって非常に高速です。


1
はい、雇用主はTrendMicroウイルスバスターCorp.を義務付けました。ウイルススキャナーを強制終了しました。gitステータスでも同じ結果になります。
Matt McMinn

1
このテーマのもう1つのバリエーションは、Credantなどのオンザフライ暗号化ソフトウェアです。これにより、ボックスの速度が大幅に低下する可能性があります。
ドンブランソン

これが私にとっての問題でした。Kasperskyアンチウイルスを強制終了し、ステータスは1秒未満に戻りました。
ロビンウィンスロー

5

再梱包してみましたか?git-repack

それ以外の場合は、ディレクトリを複製し、複製されたディレクトリの.gitフォルダを削除してみてください。次に、新しいgitディレクトリを作成し、それでも遅いかどうかを確認します。

それでも遅い場合は、システムまたはハードウェアの問題のようです。Gitは、5秒以内に数百のファイルのステータスを終了します。


repackは役に立ったようです-実行した後、statusを実行すると、すぐに戻りました。しかし、数秒待ってから再びステータスを実行したところ、30秒かかりました。ディレクトリを複製しようとしましたが、同じ問題が発生しました。
Matt McMinn

うーん、面白い。外付けドライブはありますか?またはUSBフラッシュスティック?あそこのリポジトリをコピーしてみて、違いがあるかどうかを確認してください。現在使用しているドライブに問題がある可能性があります。
thedz 2009

USBドライブに違いはありません。
Matt McMinn

それは本当に奇妙です。この時点で私が本当に言えるのは、私にはわからないということだけです。リポジトリをコピーして、他の人のコンピューターで試してみることができます。少なくとも、システムにローカルな問題であるかどうかがわかります。
thedz 2009

4

何らかの理由git statusで、リポジトリフォルダを新しい場所に移動またはコピーした後は特に遅くなります。

この場合、後続の実行は通常より高速です。


1
最初の実行でこの速度低下を回避する方法はありますか?git gcを試しましたが、役に立ちませんでした。ファイルをコピーした後、初めて発生するため、問題はありません。
franksands

最初の速度低下を回避する方法はわかりませんが、それを実行できるコマンドがあれば、おそらく最初のgit statusコマンドと同じことを実行するため、完了するまでに同じ時間がかかる可能性があります。
DanJAB 2018年

4

私はgit statusグローバルなので、非常に遅い(1分まで)した.gitignoreファイルは私の窓に位置していたアクセスできないネットワーク共有に格納された、USERPROFILE。

git config --global core.excludesfile
のようなものを示した \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

何らかの理由\\Nxxxx0でアクセスできず、ユーザープロファイルがバックアップシステムから読み込まれました\\Nxxxxx1。通常、私のユーザープロファイルはエンタープライズスタートアップスクリプトによってドライブ文字にバインドされており、そのドライブ文字へのアクセスは通常どおり機能していたため、それを理解するのに少し時間がかかりました。git-configがドライブ文字ではなくネットワーク共有を使用した理由がわかりません(おそらく若い私が責任を負います)

設定
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git status後、通常の速度に戻りました。


3

実行git fsckすると、過去にこの問題が解決されました。


3

私にとって、速度が遅いのは、追跡されていないファイル(スクリプトからの一時ファイルと出力ファイル)がたくさんあるためでした。実行中git status -unoは、追跡されていないファイルを除外し、はるかに高速に実行され、私の要件を満たしています。


1

私にとっての問題は、ローカルハードドライブに多くの異なるリポジトリのクローンが作成されていたため、リポジトリが多いほど、gitstatusなどのコマンドの実行にかかる時間が長くなることでした。

ローカルで不要になったリポジトリをたくさん削除しただけで、gitステータスが1分〜から5秒になりました。

これに似た答えはここにはありません。


1
これがgit status、1つのディレクトリで実行する標準に影響を与えることはないと思います。リポジトリが別のディレクトリにチェックアウトされている場合、git status一度に実行できるのはそのうちの1つだけです。gitリポジトリが重複している場合は別の話になるかもしれませんが、とにかくそれは悪い考えです。
HubertGrzeskowiak19年

@HubertGrzeskowiakそれは間違いなくできます。それらは私のハードドライブのさまざまな場所にありましたが、gitstatusを入力するときの読み込み時間に大きく影響しました。重複するリポジトリを削除した後、すぐに数分から5秒に高速化されました。
ジャックペリー

1

の別の側面 git status(Git 2.14.x / 2。15、2017年第4四半期に)改善される、無視されたファイルも表示される場合です(git status --ignored

" git status --ignored"は、追跡されたパスのないディレクトリが無視されることに気付いた場合でも、ディレクトリ内の無視されたすべてのパスを列挙しました。これは不要です。
コードパスは、このオーバーヘッドを回避するように最適化されています。

Jameson Miller()によるcommit 5aaa7fd(2017年9月18日)を参照してください。jamill
(合併によりJunio C浜野- gitster-コミット075bc9c、2017年9月29日)

のパフォーマンスを向上させる git status --ignored

空でない無視されたディレクトリを一覧表示する場合のディレクトリ一覧表示ロジックのパフォーマンスを向上させます。空でない無視されたディレクトリを表示するために、既存のロジックは無視されたディレクトリのすべての内容を再帰的に繰り返します。
この変更により、最初のファイルが見つかるとコンテンツの反復を停止する最適化が導入されます。これにより、無視されたディレクトリに多数のファイルがあるリポジトリでの「gitstatus--ignored」のパフォーマンスが大幅に向上する可能性があります。

400個の無視されたディレクトリに196,000個のファイルがあるリポジトリの例でのパフォーマンスの違いの例:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

さらなる改善(Git 2 。17 、2018年第2四半期に設定)については、この回答を参照してください。


ここでの完全にランダムな例:node_modulesこのパフォーマンスの変更によって影響を受ける可能性があります。かもしれないだけ。
セスBattin

1

古いバージョンのgitには、git statusのパフォーマンスの問題があります。詳細については、gitstatusのパフォーマンスを向上させる方法を参照してください。

git 2.13には1つの修正があり、2.17以上の修正があります。2.7から2.23に移動し、遅いステータスを解決しました。もうすぐ2.24で改善が計画されています。


0

私の場合、git statusプロジェクト内のファイルの所有者とは別のユーザーとして実行すると、速度が低下しました。

すべての場合に適用できるわけではありませんchownが、現在のユーザーにとって単純なものでうまくいく場合があります。


-13

チェックアウトの新しいクローンから始めてみてください。

git clone myrepo mynewrepo

次に、mynewrepoでgitstatusを実行します。

または、勇気がある場合は、既存のチェックアウトからゴミを一掃します。

git clean -dfx

これにより、gitが無視されたファイルまたはチェックインされていないファイルのいくつかの(おそらく大きな)セットをスキャンする必要がなくなります。


無視されたファイル(git cleanの機能)をすべて削除しても効果はないと思います。すでに無視されています。git cleanを実行すると、すべての構成ファイルなどが削除される可能性が高くなります。このコマンドは元に戻せません。再クローン作成(必要に応じて最初に古いリポジトリを保存する)は、git cleanを実行するよりもはるかに優れており、同じ効果があります。
XP84 2013年

5
私はこの答えに同意しない必要があります。gitclean-dfxを実行すると問題が発生する可能性があります。
Marcel Valdez Orozco 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.