Comment puis-je faire git afficher une liste des fichiers qui sont suivis?

535

En utilisant la ligne de commande git, comment puis-je faire afficher à git une liste des fichiers qui sont suivis dans le référentiel?

RobertL
la source
5
doublon possible des fichiers
Kristján
2
Je le crois. Mais il ne semble pas juste de marquer cela comme dup quand cela a une meilleure réponse.
lindhe
5
dans un univers parallèle, il est inquiétant de constater à quel point cette question est similaire, y compris toutes les réponses, mais chacune avec son propre style.
Jeff Puckett

Réponses:

628

Si vous souhaitez répertorier tous les fichiers actuellement suivis sous la branche master, vous pouvez utiliser cette commande:

git ls-tree -r master --name-only

Si vous voulez une liste des fichiers qui ont déjà existé (c'est-à-dire y compris les fichiers supprimés):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
la source
61
Utilisez git ls-tree -r HEAD --name-only si vous voulez lister les fichiers de la branche courante
Ramast
3
Pourquoi les répertoires ne sont-ils pas répertoriés?
Shuzheng
13
@NicolasLykkeIversen - gitne versionne pas directement les répertoires. Au lieu de cela, il stocke les fichiers et leurs chemins. ls-treeaffichera tous les fichiers versionnés. Pour mieux comprendre cette distinction, essayez de transférer un répertoire vide vers git. Le répertoire vide n'apparaîtra jamais dans les modifications par étapes. La seule façon de versionner un tel répertoire vide est de réellement versionner un fichier sous le répertoire. Pour les cas d'utilisation où vous avez besoin d'un tel répertoire d'espace réservé vide dans le contrôle de version, vous pouvez créer un fichier factice sous le répertoire, et en version. J'espère que l'explication est claire.
Tuxdude
2
Notez simplement que ls-tree masterles fichiers suivis ne sont pas affichés dans la zone de transfert.
nn0p
Est-il possible d'afficher uniquement le répertoire de niveau supérieur s'il comprend de nombreux sous-répertoires et fichiers?
Blaszard
192

Les fichiers gérés par git sont affichés par git ls-files. Consultez sa page de manuel.

vonbrand
la source
4
Cela semble ne montrer que les fichiers au niveau ou en dessous du répertoire actuel.
Lyle Z
11
Cela vous dérange si je modifie cela pour inclure les sections pertinentes de la page de manuel?
Nathan Basanese
1
@NathanBasanese vous pouvez peut-être ajouter une autre réponse avec ces informations.
José Castro
@LyleZ Peut-être que cela est destiné à être en accord avec ls... ouls -R
flow2k
1
@LyleZ De plus, ce comportement est le même avec git ls-tree- il est relatif au pwd.
flow2k
18

La réponse acceptée n'affiche que les fichiers de l'arborescence du répertoire actuel. Pour afficher tous les fichiers suivis qui ont été validés (sur la branche actuelle), utilisez

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree fait exécuter la commande comme si vous étiez dans le répertoire racine du référentiel.
  • -rrevient dans les sous-répertoires. Combiné avec --full-tree, cela vous donne tous les fichiers validés et suivis.
  • --name-only supprime les informations SHA / permission lorsque vous voulez simplement les chemins de fichier.
  • HEADspécifie pour quelle branche vous voulez la liste des fichiers validés suivis. Vous pouvez changer cela en masterou tout autre nom de branche, mais HEADc'est le commit que vous avez vérifié en ce moment.

Il s'agit de la méthode de la réponse acceptée à la ~ question en double https://stackoverflow.com/a/8533413/4880003 .

Nathan
la source
Merci! Cela fonctionne également pour les dépôts nus.
hzpc-joostk
5

Vous voudrez peut-être une sortie colorée avec cela.

J'utilise ce one-liner pour lister les fichiers et répertoires suivis dans le répertoire courant de la branche courante:

ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)

Vous pouvez l'ajouter en tant qu'alias:

alias gl='ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)'

Si vous souhaitez répertorier récursivement les fichiers:

'ls' --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)

Et un alias:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Pauvre fou
la source
L' glralias que vous avez fournie a regardé un peu bizarre alors j'ai fait une version plus compatible avec le format du premier alias que vous avez fourni: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Testé avec git version 2.20.1sur Debian 10.
baltakatei