Git est très lent pour 100 000 objets. Toutes les corrections?
J'ai un "nouveau" git-svn repo (11.13 GB) qui a plus de 100 000 objets à l'intérieur.
J'ai préformé
git fsck
git gc
sur le repo après la période initiale de la caisse.
J'ai ensuite essayé de faire un
git status
Le temps qu'il faut pour faire un git status est n'importe où à partir de 2m25.578s et 2m53.901s
J'ai testé git status par l'émission de la commande
time git status
5 fois et toutes les fois couru entre les deux horaires indiqués ci-dessus.
Je suis en train de faire sur un Mac OS X, localement non pas grâce à une VM.
Il n'existe aucun moyen il convient de prendre ce long.
Des idées? De l'aide?
Grâce.
Modifier
J'ai un collègue assis à côté de moi avec un comparable de la boîte. Moins de RAM et sous Debian avec un système de fichiers jfs. Son git status s'exécute dans .3 sur le même repo (c'est aussi un git-svn checkout).
Aussi, j'ai récemment changé mon fichier permissions (777) sur ce dossier et il a apporté à la fois une baisse considérable (pourquoi, j'en sais rien). Je peux maintenant le faire n'importe où entre 3 et 6 secondes. C'est gérable, mais toujours une douleur.
- la quantité de ram, avez-vous installé? et quel genre de disque?
- 8 go de RAM Hitachi HTS543232L9SA02: Capacité: 320.07 GO (320,072,933,376 octets)
- Quelle est la taille de l'opération (MO, pas d'objets)? Vous avez raison, cependant, qu'il ne faut pas que long-j'ai un repo avec > 300K objets et "git status" prend .1 ms sur une machine semblable.
- 11.13 GO
- est 11.13 GO la taille de .git ou de l'ensemble des pensions de avec .git-t-il?
Vous devez vous connecter pour publier un commentaire.
Il est venu vers le bas pour un couple d'éléments que je peux voir maintenant.
git gc --aggressive
777
Il y a autre chose, mais c'était les choses clairement fait le plus d'impact.
git gc --aggressive
lire le lien de @CharlesL. commentaire de voir pourquoi ses pas recommandé et pourquoi il va peut-être devenir des sans-papiers. Pour moi, il a fini dans un mémoire erreur fatale et cassé mon local repo.git gc --aggressive
peuvent avoir résolu votre problème spécifique, mais il bousille de bons packs. Un gc + agressif repack aurait probablement été mieux (voir @Charles du lien ci-dessus), suivie d'une ré-clone (git clone file:///Users/foo/bar/myrepo/.git newclone
).--aggressive
n'a jamais été supprimé, mais prend désormais en charge--depth
et--window
, ce qui me fait soupçonner que c'est juste une autre façon de faire le travail décrit comme la "meilleure méthode" dans ce blog.git status a qu'à regarder à chaque fichier dans le référentiel de tous les temps. Vous pouvez le dire d'arrêter de regarder les arbres que vous ne travaillez pas avec
source
À partir de la page de manuel:
Maintenant, clairement, cette solution n'est d'aller travailler si il y a des parties de l'opération que vous pouvez facilement ignorer. Je travaille sur un projet de taille similaire, et il y a certainement de grands arbres que je n'ai pas besoin de vérifier sur une base régulière. La sémantique de git-le statut en faire un général O(n) problème (n nombre de fichiers). Vous avez besoin d'un domaine spécifique des optimisations à faire mieux que ça.
Noter que si vous travaillez dans une configuration de couture, qui est, si vous intégrer des modifications de l'amont par fusion au lieu de cela, alors cette solution devient de moins en moins pratique, en raison d'une modification à un --assume-inchangé objet de la fusion dans de l'amont devient un conflit de fusion. Vous pouvez éviter ce problème avec un rebasage de flux de travail.
Une solution à long terme est d'accroître git pour le cache du système de fichiers d'état à l'interne.
Karsten Blees l'a fait pour msysgit, ce qui améliore considérablement les performances sur Windows. Dans mes expériences, son changement a pris le temps de "git status" de 25 secondes à 1 à 2 secondes sur mon Win7 machine exécutant sur une machine virtuelle.
Karsten changements: https://github.com/msysgit/git/pull/94
Discussion de la mise en cache approche: https://groups.google.com/forum/#!topic/msysgit/fL_jykUmUNE/discussion
git status
devrait être plus rapide dans Git 2.13 (T2 2017), en raison de:git status
performances")Sur ce dernier point, voir s'engager a33fc72 (14 Avril 2017) par Jeff Hostetler (
jeffhostetler
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager cdfe138, 24 Avril 2017)Git 2.14 améliore encore le git status de la performance par une meilleure prise en compte de la "sans traces de cache", qui permet à Git d'ignorer la lecture de la non chaînée des répertoires si leur
stat
données n'ont pas changé, à l'aide de lamtime
domaine de lastat
structure.Voir le
Documentation/technical/index-format.txt
pour en savoir plus sur sans traces de cache.Voir s'engager edf3b90 (08 Mai 2017) par David Turner (
dturner-tw
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager fa0624f, 30 Mai 2017)Plus généralement, de l'écriture dans le cache sera également plus rapide, avec Git 2.14.x/2.15
Voir s'engager ce012de, s'engager b50386c, s'engager 3921a0b (21 Août 2017) par Kevin Willford (`).
(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 030faf2, 27 Août 2017)Mise À Jour Déc. 2017: Git 2.16 (T1 2018) proposera une amélioration supplémentaire, cette fois pour
git log
, depuis le code pour itérer sur les fichiers de l'objet juste obtenu optimisé.Voir s'engager 163ee5e (04 Déc 2017) par Derrick Stolee (
derrickstolee
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 97e1f85, 13 Décembre 2017)Mise à jour: Mars 2018: Git 2.17 permettra d'améliorer
git status
plus: voir cette réponse.Mise à jour: Git 2.20 (T4 2018) ajoute Entrée d'Index de Table de Décalage (IEOT), ce qui permet de
git status
pour charger l'index plus rapide.Voir s'engager 77ff112, s'engager 3255089, s'engager abb4bb8, s'engager c780b9c, s'engager 3b1d9e0, s'engager 371ed0d (10 Oct 2018) par Ben Peart (
benpeart
).Voir s'engager 252d079 (26 septembre 2018) par Nguyễn Thái Ngọc Duy (
pclouds
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager e27bfaa, 19 Oct 2018)Qui permet de:
Git 2.21 (T1 2019) introduit une nouvelle amélioration, avec la mise à jour de la lâche objet cache, utilisée pour optimiser l'existence look-up, qui a été mis à jour.
Voir s'engager 8be88db (07 Jan 2019), et s'engager 4cea1ce, s'engager d4e19e5, s'engager 0000d65 (06 Jan 2019) par René Scharfe (
rscharfe
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager eb8638a, 18 janvier 2019)En général mon mac est ok avec git, mais si il y a beaucoup d'objets en vrac alors il devient beaucoup plus lent. Il semble hfs n'est pas si bon avec beaucoup de fichiers dans un seul répertoire.
Suivie par
Permet de faire un seul fichier de pack et de supprimer tous les objets qui restent. Il peut prendre un certain temps pour exécuter ces.
Vous pourriez essayer de passer le
--aggressive
passer àgit gc
et voir si cela aide:Aussi, vous pouvez utiliser
git filter-branch
pour supprimer les anciens s'engage et/ou des fichiers si vous avez des choses dont vous n'avez pas besoin dans votre histoire (par exemple, les vieux fichiers binaires).Pour ce que ça vaut, j'ai récemment trouvé une grande écart entre le
git status
commande entre mon maître et dev branches.Pour couper une longue histoire courte, j'ai traqué le problème à une seule 280 MO fichier dans le répertoire racine du projet. Il a été un accident de l'archivage d'un dump de la base, donc c'était bien de le supprimer.
Voici l'avant et l'après:
J'ai de 105 000 objets dans le magasin, mais il semble que les fichiers volumineux sont plus une menace que de nombreux petits fichiers.
Vous pourriez aussi essayer
git repack
Peut-être que vous utilisez un scanner de virus?
J'ai testé quelques gros projets, ici, sur Windows et sur Linux, il était sacrément rapide!
Je ne pense pas que vous avez besoin de faire un git gc dans un cloné repo (elle doit être propre).
Est votre disque dur OK? IOPS et R/W par seconde? C'est peut-être endommagé?
peut-être spotlight est d'essayer d'indexer les fichiers. Peut-être désactiver spotlight pour votre code dir. Vérifier le Moniteur d'Activité et de voir quels sont les processus en cours d'exécution.
Je voudrais créer une partition à l'aide d'un système de fichier différent. DFT+ a toujours été lent pour moi par rapport à faire des opérations similaires sur d'autres systèmes de fichiers.
Essayez d'exécuter le Pruneau commande, il vous permettra de vous débarrasser de, objets en vrac