web-dev-qa-db-fra.com

Compter le nombre de lignes dans un référentiel git

Comment compter le nombre total de lignes présentes dans tous les fichiers d'un référentiel git?

git ls-files me donne une liste de fichiers suivis par git.

Je cherche une commande pour cat tous ces fichiers. Quelque chose comme

git ls-files | [cat all these files] | wc -l
659
Dogbert

xargs fera ce que vous voulez:

git ls-files | xargs cat | wc -l

Mais avec plus d'informations et probablement mieux, vous pouvez faire:

git ls-files | xargs wc -l
1010
Carl Norum
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Cela montre les différences entre l’arbre vide et votre arbre de travail actuel. Ce qui arrive à compter toutes les lignes de votre arbre de travail actuel.

Pour obtenir les numéros dans votre arbre de travail actuel, procédez comme suit:

git diff --shortstat `git hash-object -t tree /dev/null`

Cela vous donnera une chaîne comme 1770 files changed, 166776 insertions(+).

311
ephemient

Si vous voulez ce nombre parce que vous voulez avoir une idée de la portée du projet, vous pouvez préférer la sortie de CLOC ("Compter les lignes de code"), ce qui vous donne une ventilation des lignes de code significatives et non significatives par langue.

cloc $(git ls-files)

(Cette ligne équivaut à git ls-files | xargs cloc. Elle utilise shname __ ’s $(), fonction de substitution de commande .)

Exemple de sortie:

      20 text files.
      20 unique files.                              
       6 files ignored.

http://cloc.sourceforge.net v 1.62  T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                       2             13            111            309
JSON                             3              0              0             58
HTML                             2              7             12             50
Handlebars                       2              0              0             37
CoffeeScript                     4              1              4             12
SASS                             1              1              1              5
-------------------------------------------------------------------------------
SUM:                            14             22            128            471
-------------------------------------------------------------------------------

Vous devrez d'abord installer CLOC. Vous pouvez probablement installer clocavec votre gestionnaire de paquets - par exemple, brew install cloc avec Homebrew .

cloc $(git ls-files) est souvent une amélioration par rapport à cloc .. Par exemple, l'exemple de sortie ci-dessus avec git ls-files rapporte 471 lignes de code. Pour le même projet, cloc . rapporte 456 279 lignes (et son exécution prend six minutes), car il recherche les dépendances dans le dossier node_modules de Git-ignored.

274
Rory O'Kane

J'ai rencontré des problèmes de traitement par lots avec git ls-files | xargs wc -l lorsque je traitais un grand nombre de fichiers, le nombre de lignes étant divisé en plusieurs lignes totalname__.

Prenant un conseil de la question Pourquoi l’utilitaire wc génère-t-il plusieurs lignes avec "total"? , j'ai trouvé la commande suivante pour contourner le problème:

wc -l $(git ls-files)

Ou si vous souhaitez examiner uniquement certains fichiers, par exemple code:

wc -l $(git ls-files | grep '.*\.cs')

49
Justin Aquadro

La meilleure solution, pour moi en tout cas, est enterrée dans les commentaires de la réponse de @ ephemient. Je suis juste en train de le tirer ici pour que ça ne passe pas inaperçu. Le mérite en revient à @FRoZeN (et @ephemient).

git diff --shortstat `git hash-object -t tree /dev/null`

renvoie le nombre total de fichiers et de lignes du répertoire de travail d'un référentiel, sans bruit supplémentaire. En prime, seul le code source est compté - les fichiers binaires sont exclus du décompte.

La commande ci-dessus fonctionne sous Linux et OS X. La version multiplateforme de celle-ci est

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Cela fonctionne aussi sous Windows.

Pour mémoire, les options pour exclure les lignes vides,

  • -w/--ignore-all-space,
  • -b/--ignore-space-change,
  • --ignore-blank-lines,
  • --ignore-space-at-eol

n'a aucun effet lorsqu'il est utilisé avec --shortstat. Les lignes vides sont comptées.

37
hashchange

Cela fonctionne à partir de cloc 1.68:

cloc --vcs=git

13
kes

Je jouais avec cmder ( http://gooseberrycreative.com/cmder/ ) et je voulais compter les lignes html, css, java et javascript. Alors que certaines des réponses ci-dessus ont fonctionné, le modèle or de grep n’a pas - j’ai trouvé ici ( https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple- motifs ) que je devais y échapper

Donc, voici ce que j'utilise maintenant:

git ls-files | grep "\(.html\|.css\|.js\|.Java\)$" | xargs wc -l

8
Michail Michailidis

J'utilise les éléments suivants:

git grep ^ | wc -l

Ceci recherche dans tous les fichiers versionnés par git la regex ^, qui représente le début d'une ligne. Cette commande donne donc le nombre total de lignes!

6
Christopher Shroba

Cet outil sur github https://github.com/flosse/sloc peut donner le résultat de manière plus descriptive. Il va créer des statistiques de votre code source:

  • lignes physiques
  • lignes de code (source)
  • lignes avec commentaires
  • commentaires sur une seule ligne
  • lignes avec des commentaires de bloc
  • lignes mélangées avec source et commentaires
  • lignes vides
3
love

J'ai fait ça:

git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l

cela fonctionne si vous comptez tous les fichiers texte du référentiel comme des fichiers d’intérêt. Si certains sont considérés comme de la documentation, etc., un filtre d'exclusion peut être ajouté.

2
Sasha Pachev
: | git mktree | git diff --shortstat --stdin

Ou:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
0
user4427511

Essayer:

find . -type f -name '*.*' -exec wc -l {} + 

sur le répertoire/les répertoires en question

0
Theos