J'ai adapté la réponse d'edmondscommerce en ajoutant une simple déclaration awk qui additionne la sortie de la boucle for et imprime la somme (divisée par 1024*1024 pour convertir en Mo)
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr | awk ' {tot = tot+$1; print } END{ printf("%.2fMb\n",tot/(1024*1024)) }'
Notez que --porcelain imprime les noms de chemin relatifs à la racine des dépôts git. Donc, si vous faites cela dans un sous-répertoire, l'instruction du ne pourra pas trouver les fichiers..
(woppa ; ma première réponse dans SoF, que la force soit avec elle)
J'ai utilisé une version modifiée de ceci, car j'avais des fichiers avec des espaces qui l'ont fait planter. J'étais également incertain des calculs de taille et j'ai supprimé un head
inutile :
git status --porcelain | sed 's/^...//;s/^"//;s/"$//' | while read path; do
du -bs "$path" ;
done | sort -n | awk ' {tot = tot+$1; print } END { printf("%.2fMB\n",tot/(1024*1024)) }'
Je préfère utiliser while
car il est légèrement plus sûr que for
:il peut toujours faire des choses désagréables avec des fichiers qui contiennent des retours à la ligne donc j'aimerais qu'il y ait un à passer null
-fichiers séparés tout en étant toujours capable de grep pour le statut, mais je n'ai pas trouvé de moyen agréable pour cela.
Je pense avoir répondu à ma propre question :
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
Cependant, je suis ouvert à toutes meilleures idées ou astuces utiles. Ma sortie actuelle est de 13 Go :)
La commande ci-dessus est essentiellement là, elle me donne le total ligne par ligne à partir du statut git mais ne me donne pas la somme totale. Je reçois actuellement le total de tous les fichiers à la fin, ce qui n'est pas correct. J'ai essayé d'utiliser bc
mais impossible de le faire fonctionner