954 votes

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 dépôt git ?

git ls-files me donne une liste des 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

1478voto

Carl Norum Points 114072

xargs fera ce que vous voulez :

git ls-files | xargs cat | wc -l

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

git ls-files | xargs wc -l

0 votes

Cela compte double lorsque vous avez des liens symboliques dans votre référentiel. Peut-être que ce n'est pas un problème, cependant.

15 votes

Je pense que c'est trivial ; pourquoi ne pas inclure uniquement les fichiers de code source (par exemple *.cpp). Nous avons quelques fichiers bin engagés :)

56 votes

Bâton grep cpp | là-dedans avant le xargs alors.

412voto

Rory O'Kane Points 4866

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 de code significatives et insignifiantes par langue.

cloc $(git ls-files)

(Cette ligne est équivalente à git ls-files | xargs cloc . Il utilise sh 's $() substitution de commande caractéristiques.)

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 devez d'abord installer le 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 rapporte 471 lignes de code. Pour le même projet, cloc . rapporte un nombre impressionnant de 456 279 lignes (et prend six minutes à exécuter), parce qu'il recherche les dépendances dans le fichier Git-ignoré node_modules dossier.

4 votes

Le CLOC ignore certains langages, tels que TypeScript.

9 votes

@MarceloCamargo pour le moment TypeScript est supporté

1 votes

Pour le débutant, il vaut mieux exécuter "cloc DIRECTORY_WHERE_YOUR_GIT_IN" pour calculer les lignes.

409voto

ephemient Points 87003
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Cela montre les différences entre l'arbre vide et votre arbre de travail actuel. Ce qui se trouve à compter toutes les lignes dans votre arbre de travail actuel.

Pour obtenir les chiffres de 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(+) .

46 votes

BTW, vous pouvez obtenir ce hachage en exécutant git hash-object -t tree /dev/null .

87 votes

Et encore plus succinct : git diff --stat `git hash-object -t tree /dev/null`

11 votes

C'est la meilleure solution puisque cela ne compte pas les fichiers binaires comme les archives ou les images qui sont comptés dans la version ci-dessus !

73voto

Justin Aquadro Points 1212

J'ai rencontré des problèmes de mise en lots avec git ls-files | xargs wc -l lorsqu'il s'agit d'un grand nombre de fichiers, où le nombre de lignes est réparti en plusieurs morceaux. total lignes.

Un conseil sur 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 voulez examiner seulement certains fichiers, par exemple le code :

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

0 votes

C'est très bien mais cela semble échouer pour les chemins qui contiennent des espaces blancs. Existe-t-il un moyen de résoudre ce problème ?

1 votes

J'ai eu des problèmes avec grep '.* \.m J'ai trouvé des fichiers binaires comme .mp3, .mp4. J'ai eu plus de succès en utilisant la commande find pour lister les fichiers de code. wc -l $(git ls-files | find *.m *.h)

3 votes

@LeaHayes c'est une façon de faire : wc -l --files0-from=<(git ls-files -z) . Le site <(COMMAND) La syntaxe renvoie le nom d'un fichier dont le contenu est le résultat de la commande COMMAND .

69voto

hashchange Points 979

La meilleure solution, pour moi en tout cas, est enfouie dans les commentaires de la réponse de @ephemient. Je ne fais que la ressortir ici pour qu'elle ne passe pas inaperçue. Le mérite de cette solution revient à @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 décompte.

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

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Cela fonctionne aussi sous Windows.

Pour mémoire, les options d'exclusion des lignes vides,

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

n'ont pas d'effet lorsqu'ils sont utilisés avec --shortstat . Les lignes vides sont comptées.

1 votes

git mktree </dev/null ou true|git mktree ou git mktree <&- ou :|git mktree pour ceux qui comptent les frappes de clavier parmi nous :-) - un arbre vide de rechange flottant autour du dépôt ne fera pas de mal à personne.

4 votes

Pour les personnes qui se demandent ce qu'est ce hachisch sorti de nulle part : stackoverflow.com/questions/9765453/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X