88 votes

Comment obtenir le statut git d'un seul sous-dossier ?

Lorsque je fais git status dans un sous-dossier de mon dépôt, cela inclut le statut des dossiers parents également.

Existe-t-il un moyen de limiter git-status à un dossier particulier ?

1 votes

Non, "git status ." donne les dossiers frères et soeurs comme par exemple "../sibling".

0 votes

Pourriez-vous nous donner un peu plus de détails sur les raisons pour lesquelles vous souhaitez filtrer les modifications apportées ailleurs dans votre arbre ? Dans quelles situations souhaiteriez-vous utiliser cette fonctionnalité ?

1 votes

S'il y a plus d'un écran complet de sortie de la commande normale "git status"

111voto

Matt Curtis Points 12454
git status .

affichera l'état du répertoire actuel et des sous-répertoires.

Par exemple, des fichiers donnés (numéros) dans cet arbre :

a/1
a/2
b/3
b/4
b/c/5
b/c/6

du sous-répertoire "b", git status montre les nouveaux fichiers dans l'ensemble de l'arbre :

% git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   ../a/1
#   new file:   ../a/2
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

mais git status . ne montre que les fichiers en "b" et en dessous.

% git status .
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   3
#   new file:   4
#   new file:   c/5
#   new file:   c/6
#

Juste ce sous-répertoire, pas en dessous

git status . affiche tous les fichiers situés sous "b" de manière récursive. Pour afficher seulement les fichiers dans le "b" mais pas en dessous, vous devez passer une liste de seulement les fichiers (et pas les répertoires) à git status . C'est un peu compliqué, en fonction de votre shell.

Zsh

Dans zsh, vous pouvez sélectionner des fichiers ordinaires avec le "qualificateur global". (.) . Par exemple :

% git status *(.)
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Bash

Bash n'a pas de qualificatifs globaux mais vous pouvez utiliser GNU find pour sélectionner des fichiers ordinaires et les transmettre ensuite à git status comme ça :

bash-3.2$ find . -type f -maxdepth 1 -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

Cela utilise -maxdepth qui est un GNU find extension. POSIX find n'a pas -maxdepth mais vous pouvez le faire :

bash-3.2$ find . -path '*/*' -prune -type f -exec git status {} +
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   3
        new file:   4

2 votes

Désolé d'avoir mis tant de temps pour revenir à cette réponse - simple et correcte ! Je me demande si <pathspec> a été ajouté au statut git suite à ma question ?

0 votes

Et si vous n'êtes intéressé que par le dossier actuel où . fait référence mais pas à ses sous-dossiers. Y a-t-il un moyen de contourner ce problème ? Merci !

0 votes

@benjaminz dépend de votre utilisation -- pour ce genre de choses, j'utilise le globbing shell pour sélectionner les fichiers mais pas les sous-répertoires, par exemple (pour zsh). git status *(.) . Bash ne dispose pas d'un raccourci permettant de regrouper uniquement les fichiers, mais vous pouvez utiliser une méthode étendue de type find par exemple find . -type f -maxdepth 1 -exec git status {} + . Cela semble être le genre de choses que vous voudriez mettre dans un alias ou un script plutôt que de les taper tout le temps.

9voto

Joël Conraud Points 51

Il est possible de restreindre git status vers le répertoire courant (sans dossiers enfants) en donnant un chemin d'accès utilisant le mot magique glob y *: :

git status ':(glob)*'

4voto

Marcus Griep Points 3010

Imparfait, mais cela fonctionne aussi bien à partir du répertoire qui vous intéresse :

git status | grep -v ' \.\./'

Cela masquera tous les répertoires qui nécessiteraient une référence ascendante dans leur chemin relatif.

Si vous voulez avoir de la couleur qui sort de l'autre côté, définissez color.status a always :

git config color.status always

2 votes

J'aime comment grep offre toujours une solution de fortune si vous n'en connaissez pas une plus spécifique. Santé à la programmation taco-bell.

0 votes

C'est beaucoup plus puissant !

3voto

VonC Points 414372

Certaines commandes de plomberie prennent un répertoire comme paramètre :

git ls-files -t -o -m aDirectory

vous donnerait tous les fichiers modifiés mais non mis à jour (non ajoutés à l'étape), ou non suivis. Et cela pour un répertoire.

Comme écrit dans ce fil git ls-files ne prend pas en charge l'option ' --added option.

La raison la plus fondamentale est que ls-files la plomberie concerne le indice .
Ajouté est no sur la comparaison entre l'index et l'arbre de travail.
Il se trouve entre le commit HEAD et l'index, et il n'appartient pas à la plomberie ls-files.

Donc, en utilisant les commandes mentionné ici :

git diff-index --name-only -B -R -M -C HEAD src

vous donnerait à la fois des fichiers ajoutés et non ajoutés.

git diff-files --name-only -B -R -M -C src

vous donnerait uniquement les fichiers non ajoutés. (tout en détectant les réécritures, renommages, copies, ...)

Comme d'habitude avec les commandes de plomberie, un peu de script est nécessaire ;)

1voto

sauravjoshi23 Points 380

Pour moi, cela a fonctionné :

git status -uall

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