88 votes

les moyens d'améliorer git status de la performance

J'ai une pension de 10 GO sur une machine linux qui est sur NFS. La première fois git status faut 36 minutes et suivantes git status prend 8 minutes. Semble GIT dépendent du système d'exploitation pour la mise en cache des fichiers. Seule la première commandes git commit,statut qui implique pack/déballage de l'ensemble des pensions de prend un temps très long pour un plus grand repo. Ne suis pas sûr si vous avez utilisé git status sur une telle grande repo, mais quelqu'un a rencontré ce problème?

J'ai essayé de "git gc" "git propre" git repack" mais le temps est toujours/presque le même. Sous-modules ou d'autres concepts comme la rupture de l'opération dans les plus petits de l'aide? Si oui, lequel est le meilleur pour le fractionnement d'une plus grande prise en pension. Est-il un autre moyen d'améliorer le temps pris pour les commandes git sur un grand repo?

46voto

Josh Lee Points 53741

Pour être plus précis, git dépend de l'efficacité de l' lstat(2) appel système, afin de peaufiner votre client "attribut délai d'expiration du cache" pourrait faire l'affaire.

Le manuel pour l' git-update-index - essentiellement un mode manuel pour git-status - décrit ce que vous pouvez faire pour atténuer ce, par l'aide de la --assume-unchanged drapeau de supprimer son comportement normal et mettre à jour manuellement les chemins que vous avez changé. Vous pouvez même programmer votre éditeur pour annuler cet indicateur à chaque fois que vous enregistrez un fichier.

L'alternative, comme vous le suggérez, est de réduire la taille de votre caisse (la taille de la packfiles n'entrent vraiment en jeu ici). Les options sont un sparse checkout, submodules, ou Google pensions de l'outil.

(Il existe une liste de diffusion thread sur l'utilisation de Git avec NFS, mais il n'a pas répondu à de nombreuses questions.)

39voto

user1077329 Points 111

Je vois aussi ce problème sur un grand projet partagé par NFS.

Il m'a fallu un peu de temps pour découvrir le drapeau de l'onu, qui peut être donné à la fois git commit et git status.

Ce que cet indicateur n'est pour désactiver la recherche de sans traces de fichiers. Cela réduit le nombre d'opérations nfs de manière significative. La raison en est que, pour git à découvrir sans traces de fichiers, il a qu'à regarder dans tous les sous-répertoires, donc si vous avez de nombreux sous-répertoires cela va vous faire du mal. En désactivant git à partir de la recherche de sans traces de fichiers vous permet d'éliminer toutes ces opérations NFS.

Combinez-le avec le cœur.preloadindex drapeau et vous pouvez obtenir resonable performance même sur NFS.

21voto

beno Points 1148

Si votre repo git utilise de façon intensive les submodules, vous pouvez considérablement accélérer les performances de git status en éditant le fichier de config dans le .répertoire git et réglage de l' ignore = dirty sur tout particulièrement volumineux submodules. Par exemple:

[submodule "mysubmodule"]
url = ssh://mysubmoduleURL
ignore = dirty

Vous allez perdre la commodité d'un rappel qu'il y a unstaged des changements dans les submodules que vous ayez oublié, mais vous aurez toujours conserver la commodité principale de savoir quand les submodules sont hors de synchronisation avec les principaux repo. De Plus, vous pouvez toujours modifier votre répertoire de travail à la sous-module lui-même et l'utilisation de git d'état à l'intérieur comme par l'habitude de le voir de plus amples informations. Voir cette question pour plus de détails sur ce "sale" signifie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X