2016-08-26 3 views
2

J'écris un script pour analyser les changements qui ont été faits dans un repo git. À un certain moment je à itérer sur tous les commits et obtenir ces informations sur chacun d'eux:Exécution de git diff-tree avec --numstat et --name-status

  • Engagez ID
  • Date de
  • le message de validation
  • ...
  • Fichiers modifiés
    • Nom de fichier
    • Type de modification (Ajouté/Modifié/Retiré/Renommé)
    • Nouveau nom du fichier (dans le cas où le type de changement est "Rebaptisé")
    • Nombre de lignes ajouté
    • Nombre de lignes supprimées

Je reçois la validation des messages et les dates git log . Le problème que j'ai avec les fichiers.

Si je ne veux pas recueillir le nombre de lignes ajouté/enlevé, je voudrais simplement utiliser

git diff-tree --no-commit-id --name-status -M -r abcd12345 

La sortie serait quelque chose comme

A Readme.md 
M src/something.js 
D src/somethingelse.js 
R100 tests/a/file.js tests/b/file.js 

Ce que je peux analyser et lire par programme.

Pour obtenir des informations sur les lignes ajoutées/supprimés, je pourrais utiliser ceci:

git diff-tree -M -r --numstat abcd12345 

La sortie serait comme:

abcd12345 
82 0 Readme.md 
41 98 src/something.js 
0 64 src/somethingelse.js 
0 0 tests/{a => b}/file.js 

Ce qui est pas lisible par machine pour les fichiers renommés.

Ma question est: Y at-il un moyen de combiner ces deux commandes? Il semble que je ne puisse pas utiliser --numstat avec --name-status.

Je peux exécuter deux commandes séparées et fusionner le résultat dans mon script. Dans ce cas, y a-t-il d'autres commutateurs que je peux utiliser pour rendre le résultat de la deuxième commande plus lisible par machine?

Merci.

Répondre

2

Je pense que votre analyse (que vous avez besoin de deux commandes séparées) est correcte. Utilisez -z pour obtenir une sortie lisible par machine avec --numstat (cela désactive l'encodage de renommage fantaisie et tous les caractères spéciaux), mais notez que vous devrez ensuite séparer les lignes au format ASCII NUL au lieu des nouvelles lignes.

+0

Ne connaissait pas '-z'. Très utile, merci :) –