Est-il possible d'obtenir des informations sur la quantité d'espace gaspillée par les changements dans chaque commit - donc je peux trouver des commits qui ont ajouté de gros fichiers ou beaucoup de fichiers. Tout ceci pour tenter de réduire la taille du repo git (rebasing et éventuellement filtrage des validations)git find fat commit
Répondre
oublié de répondre, ma réponse est:
git rev-list --all --pretty=format:'%H%n%an%n%s' # get all commits
git diff-tree -r -c -M -C --no-commit-id #{sha} # get new blobs for each commit
git cat-file --batch-check << blob ids # get size of each blob
@sschuberth: Si je lis votre script correctement, il ne prend en compte que les fichiers qui ont été _added_ dans un commit particulier. Il ne détectera pas quand un fichier a considérablement augmenté dans un commit. – kynan
@kynan: Vous avez raison, car c'est ce que l'OP a demandé (et ce dont j'avais besoin). Mais il est facile de changer le script pour détecter les fichiers modifiés: vous devez simplement remplacer "A" par "M" dans l'appel grep. Cela indiquera la taille totale du fichier après la modification (pas le nombre d'octets ajoutés/supprimés). J'accepterais volontiers une requête pull sur GitHub pour rendre le script plus générique. – sschuberth
Lien brisé, le script est maintenant situé [ici] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke
git cat-file -s <object>
où <object>
peut faire référence à un commit, un blob, un arbre ou un tag.
Vous pouvez le faire:
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
Cela montrera les plus gros fichiers en bas (quatrième colonne est le fichier (blob) Taille
Si vous avez besoin de regarder les différentes branches vous. .. ll veulent changer HEAD ces noms de branche ou, mettez cela dans une boucle sur les branches, les balises, ou revs vous êtes intéressé par
Personnellement, je trouve cette réponse à être le plus utile en essayant de trouver des fichiers volumineux dans l'histoire d'un git: Find files in git repo over x megabytes, that don't exist in HEAD
#!/bin/bash
COMMITSHA=$1
CURRENTSIZE=$(git ls-tree -lrt $COMMITSHA | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc)
PREVSIZE=$(git ls-tree -lrt $COMMITSHA^ | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc)
echo "$CURRENTSIZE - $PREVSIZE" | bc
Et aussi je suggère d'utiliser git format-patch pour obtenir la taille de commit (il y aura une taille supplémentaire pour l'en-tête mail, mais en fait si vous avez besoin d'un commit rapide pour obtenir la taille exacte, + - 1K sera une bonne précision) –
git fat find N
où N est en octets retournera tous les fichiers dans l'ensemble l'histoire qui sont plus grandes que N octets.
Vous pouvez en savoir plus sur teneur en matières grasses git ici: https://github.com/cyaninc/git-fat
Bummer. Je l'ai essayé sur Git Shell pour Windows qui vient avec GitHub Desktop et la commande n'a pas fonctionné, me donnant une erreur. – DucRP
Toutes les solutions proposées se concentrent ici sur taille des fichiers mais la question initiale posée était sur le point commettras tailles, qui, à mon avis, et dans mon cas, il était plus important de trouver (parce que ce que je voulais, c'est de se débarrasser de beaucoup de petits binaires introduits dans un seul commit, ce qui représentait beaucoup de taille, mais de petite taille si mesuré individuellement par fichier).
Une solution qui met l'accent lors de la validation des tailles est la condition here, qui est ce script perl:
#!/usr/bin/perl
foreach my $rev (`git rev-list --all --pretty=oneline`) {
my $tot = 0;
($sha = $rev) =~ s/\s.*$//;
foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) {
$blob = (split /\s/, $blob)[3];
next if $blob == "0000000000000000000000000000000000000000"; # Deleted
my $size = `echo $blob | git cat-file --batch-check`;
$size = (split /\s/, $size)[2];
$tot += int($size);
}
my $revn = substr($rev, 0, 40);
# if ($tot > 1000000) {
print "$tot $revn " . `git show --pretty="format:" --name-only $revn | wc -l` ;
# }
}
Et que j'appelle comme ceci:
./git-commit-sizes.pl | sort -n -k 1
- 1. git-svn dcommiter un seul commit git
- 2. Multiple "git add" avant "git commit"
- 3. git commit - paramétrer l'horodatage dans le futur
- 4. git commit hash d'un module chargeable externe
- 5. git-svn: comment copier les commit git d'une branche SVN à une autre?
- 6. Combiner les commandes Git locales dans un commit pour git-svn
- 7. Un commit de retour de FETCH_HEAD
- 8. git sans dossier .git - un git-dir distant
- 9. Comment montrer ce qu'un commit a fait?
- 10. find Périphérique
- 11. NHibernate find
- 12. comment annuler les modifications d'un fichier dans un commit précédent dans git
- 13. Git: extraire un fichier d'un commit précédent et le modifier en HEAD
- 14. Git: Comment rebaser de nombreuses branches (avec le même commit de base) à la fois?
- 15. Puis-je associer le nom d'utilisateur ssh avec commit avec git sur ssh?
- 16. Commit Git trouvé dans le maître, non affiché lors de l'affichage du journal d'un fichier spécifique
- 17. Comment trouver l'utilisation de la mémoire "fat" procédure?
- 18. Commit Hook Failure
- 19. msysgit commit encoding
- 20. Post-Commit Hook & Trac
- 21. Qui est plus rapide, 'find -exec' ou 'find | xargs -0 '?
- 22. Quelle est la différence entre find-grep et grep-find?
- 23. Git smudge filter
- 24. Python: re..find séquence
- 25. Aide avec std :: find
- 26. Chaîne Python find
- 27. VB.NET Prédicate Array Find
- 28. Reinh Git workflow
- 29. Comment cibler un commit spécifique SHA avec capistrano deploy
- 30. SVN à git ... maintenant git à SVN. Tant de conflits
Il suffit de considérer en cours d'exécution 'gc' git de temps en temps , éventuellement en tant que 'git gc --aggressive' – Hasturkun
' git gc' (et 'git gc --prune'); '--aggresive' peut même donner des résultats plus mauvais (mais ne devrait normalement pas l'être), et ne vaut généralement pas le coup. –
Cette réponse est beaucoup mieux: http://stackoverflow.com/a/10847242/520567 – akostadinov