web-dev-qa-db-fra.com

Afficher la taille de la validation dans le journal git

Comment puis-je obtenir la taille de validation indiquée dans la sortie de git log?

Vous pouvez comprendre taille de validation comme la différence entre ses parents et lui-même, ou tout ce qui raisonnable vous indique quelle taille la validation est.

git log a un --log-size option mais c'est la taille du message de log, pas le commit lui-même.

14
Cyker

La "taille" d'un commit peut signifier différentes choses. Si vous voulez dire combien de stockage sur disque cela prend ... c'est très difficile à dire dans Git et probablement improductif. Alors que quelque chose comme SVN stocke les validations sous forme de deltas, lorsque vous modifiez un fichier dans Git, il stocke une nouvelle copie du fichier en tant qu'objet dans une base de données de graphiques. Un objet peut être partagé dans de nombreuses validations. Bien que cela puisse sembler inefficace, Git a de nombreuses façons intelligentes d'utiliser efficacement l'espace disque de manière choquante.

Si vous voulez dire combien de lignes cela a changé, c'est facile. Vous pouvez utiliser divers indicateurs pour obtenir le nombre de fichiers et de lignes modifiés, la plupart d'entre eux contiennent le mot "stat". Par exemple, git log --shortstat vous indiquera le nombre de fichiers modifiés et le nombre de lignes insérées et supprimées. Voici un exemple.

commit e3d1909c875ea0c1a64246d735affa039ad11aa0 (Origin/master, Origin/HEAD)
Author: Michael G. Schwern <[email protected]>
Date:   Thu Aug 11 13:04:24 2016 -0700

    Add default Travis and AppVeyor configs.

    The AppVeyor one is set up for Dist::Zilla, the hardest of the bunch.

 2 files changed, 60 insertions(+)

Si vous voulez avoir une idée du stockage sur disque représenté par la validation, vous devez obtenir les ID des nouveaux fichiers (objets blob) créés par la validation, puis vérifier leur taille. Vous pouvez les voir dans un git log -p.

commit 0f28d9a96bc92d802b57900ce4a06db71cbaef6d
Author: Michael G. Schwern <[email protected]>
Date:   Wed Aug 10 09:13:40 2016 -0700

    Remove my name from the gitconfig.

    Now it can be used by anyone. Git will Prompt for the user info.

diff --git a/.gitconfig b/.gitconfig
index 1d539bd..538440f 100644
--- a/.gitconfig
+++ b/.gitconfig
@@ -1,18 +1,10 @@
-# If you use this file, remember to change the [user] and [sendemail] sections.
-
...and so on...

index 1d539bd..538440f 100644 indique cet objet blob remplacé (fichier) 1d539bd avec 538440f et utilise les autorisations 0644. Si vous exécutez git cat-file -s 538440f il me dit que l'objet fait 4356 octets. C'est sa taille non compressée . Sur le disque, c'est juste 1849 octets.

$ ls -l .git/objects/53/8440f84014584432fa5bf09d761926b3d70dbe 
-r--r--r-- 1 schwern staff 1849 Aug 10 09:14 .git/objects/53/8440f84014584432fa5bf09d761926b3d70dbe

Après je git gc même le fichier objet a disparu. Maintenant, tout est dans un fichier pack utilisant moins de 10K.

$ tree -h .git/objects/
.git/objects/
├── [ 102]  info
│   └── [  54]  packs
└── [ 136]  pack
    ├── [1.9K]  pack-d5b7110001ed35cce1aa0a380db762f39505b1c0.idx
    └── [7.8K]  pack-d5b7110001ed35cce1aa0a380db762f39505b1c0.pack

Cette réponse montre comment obtenir les blobs d'un commit de manière plus automatisée.

18
Schwern