Question Compter le nombre de lignes dans un dépôt 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

578
2018-01-27 22:07


origine


Réponses:


xargs fera ce que tu veux:

git ls-files | xargs cat | wc -l

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

git ls-files | xargs wc -l

870
2018-01-27 22:11



git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Cela montre les différences entre l'arbre vide et votre arbre de travail actuel. Qui arrive à compter toutes les lignes dans votre arbre de travail actuel.

Pour obtenir les nombres dans votre arbre de travail actuel, faites ceci:

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

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


291
2018-01-27 22:51



Si vous voulez ce compte parce que vous voulez avoir une idée de la portée du projet, vous pouvez préférer la sortie de CLOC ("Count Lines of Code"), qui vous donne une ventilation des lignes significatives et insignifiantes de code par langue.

cloc $(git ls-files)

(Cette ligne est équivalente à git ls-files | xargs cloc. Il utilise shDe $() substitution de commande fonctionnalité.)

Sortie de l'échantillon:

      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 cloc avec 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 signale 471 lignes de code. Pour le même projet, cloc . rapporte un énorme 456.279 lignes (et prend six minutes à courir), car il recherche les dépendances dans le Git-ignoré node_modules dossier.


247
2018-03-12 16:32



J'ai rencontré des problèmes de dosage avec git ls-files | xargs wc -l lorsque vous traitez un grand nombre de fichiers, le nombre de lignes sera divisé en plusieurs total lignes.

Prendre un pourboire 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 ex. code:

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


46
2017-07-30 06:03



La meilleure solution, pour moi quand même, est enterrée dans les commentaires de la réponse de @ ephemient. Je le tire juste ici pour que ça ne passe pas inaperçu. Le mérite de ceci devrait aller à @FRoZeN (et @ephemient).

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

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

La commande ci-dessus fonctionne sous Linux et OS X. La version multi-plateforme est

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Cela fonctionne aussi sur Windows.

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

  • -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.


33
2018-03-04 15:39



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

Donc voici ce que j'utilise maintenant:

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


6
2017-07-22 01:00



J'utilise ce qui suit:

git grep ^ | wc -l

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


6
2018-01-11 06:46



Cela fonctionne à partir de cloc 1,68:

cloc --vcs=git


6
2018-05-11 19:31



Cet outil sur github https://github.com/flosse/sloc peut donner la sortie de façon plus descriptive. Il va créer des statistiques de votre code source:

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

3
2018-01-04 08:00



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 dans le référentiel comme les fichiers d'intérêt. Si certains sont considérés comme de la documentation, etc., un filtre d'exclusion peut être ajouté.


2
2017-11-21 20:54



: | git mktree | git diff --shortstat --stdin

Ou:

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

0
2018-01-04 01:25