Git: liste uniquement les fichiers «non suivis» (également, commandes personnalisées)


339

Existe-t-il un moyen d'utiliser une commande comme git ls-filespour n'afficher que les fichiers non suivis?

La raison pour laquelle je pose la question est parce que j'utilise la commande suivante pour traiter tous les fichiers supprimés:

git ls-files -d | xargs git rm

Je voudrais quelque chose de similaire pour les fichiers non suivis:

git some-command --some-options | xargs git add

J'ai pu trouver l' -ooption git ls-files, mais ce n'est pas ce que je veux, car il montre également les fichiers ignorés. J'ai également pu trouver la commande longue et laide suivante:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Il semble qu'il doit y avoir une meilleure commande que je peux utiliser ici. Et s'il n'y en a pas, comment créer des commandes git personnalisées?


Pourriez-vous expliquer pourquoi en avez-vous besoin git ls-files -d | xargs git rm?
takehin

Cela supprime tous les fichiers qui manquent à git. Ma question était de savoir comment effectuer une opération connexe - ajouter tous les fichiers que git ne suit pas actuellement. Je fais généralement ces deux après avoir renommé, combiné et / ou divisé mes fichiers de code.
Nous sommes tous Monica

S'ils manquent, ne sont-ils pas déjà supprimés? À moins que ... vous ne tiriez de quelque part ailleurs et que vous essayez de vous synchroniser avec la télécommande ... je pense que je comprends.
Buttle Butkus

J'ai testé toutes les réponses, s'il y a un dossier vide non suivi, personne ne peut le trouver.
kittygirl

@kittygirl c'est correct. Parce qu'il gitne fonctionne que sur les fichiers, il n'a aucun moyen de suivre les dossiers vides. Essayez find . -type d -emptyplutôt.
Nous sommes tous Monica

Réponses:


531

Pour répertorier les fichiers non suivis, essayez:

git ls-files --others --exclude-standard

Si vous devez diriger la sortie vers xargs, il est sage de penser aux espaces blancs en utilisant git ls-files -zet xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Bel alias pour ajouter des fichiers non suivis:

au = !git add $(git ls-files -o --exclude-standard)

Edit: Pour référence: git-ls-files


7
Parfait! Qu'est-ce que cela !signifie au début de la ligne d'alias, ou où est-ce documenté?
Nous sommes tous Monica

@takeshin Comment obtenir uniquement les noms de répertoire parent? pas de sous-dossiers. Moyens dans ces fichiers non suivis: / P / a / fichiers, / P / a / images, / P / a / / P /, ... - Je veux juste lister / P /
Dr.jacky

2
Dans quelle situation auriez-vous besoin de l'alias? git add *fera la même chose: ajouter tous les fichiers non suivis à l'exception de la norme (les fichiers dont les chemins sont couverts .gitignore).
toinetoine

1
Je préfère que mon alias fonctionne de manière cohérente dans tous les répertoires du référentiel (la commande ls-files n'affiche que les fichiers modifiés dans l'arborescence actuelle), donc j'ai[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill

Merci. Bon commentaire.
Dark Egregious

71

Si vous souhaitez simplement supprimer les fichiers non suivis, procédez comme suit:

git clean -df

ajoutez xà cela si vous souhaitez également inclure des fichiers spécifiquement ignorés. J'utilise git clean -dfxun grand nombre tout au long de la journée.

Vous pouvez créer un git personnalisé en écrivant simplement un script appelé git-whateveret en le plaçant sur votre chemin.


Il est beaucoup plus courant que je souhaite ajouter tous les fichiers non suivis (par exemple, après avoir déplacé certaines choses). Dans tous les cas, merci pour l'astuce sur les commandes personnalisées. Où ce mécanisme est-il documenté?
Nous sommes tous Monica

5
Faites simplement git add -Aou git add -u(selon ce qui vous semble le plus logique)
Dustin

1
Votre commentaire est la vraie réponse, qui est également répétée plus tard par @Mike Lococo
andho

2
et "git clean -dfxn" pour un essai à sec en ajoutant "n"
charo

50

git add -A -nfera ce que vous voulez. -Aajoute tous les fichiers non suivis au référentiel, en -nfait un dry-runoù l'ajout n'est pas effectué, mais la sortie d'état donne la liste de chaque fichier qui aurait été ajouté.


7
C'est une excellente réponse! Notez qu'il exclut les fichiers dans les .gitignorefichiers, ce qui est généralement ce que nous voulons, mais sinon, git add -fAn.
cdunn2001

1
Cela semble être la meilleure réponse.
Rob Grant

1
C'est la meilleure réponse. Il indique explicitement à l'utilisateur ce qu'il ferait (sans le faire) et donne la possibilité de l'examiner avant de l'ajouter. Parfait. Merci!
digitguy

Il répertorie également les fichiers modifiés.
Frank-Rene Schäfer

belle, mais je l' obtenir enveloppé: add '$file'. Alors que git ls-files --exclude-standard -odonne une sortie nue, très chaude.
hyperpallium

28

La réponse acceptée se bloque sur les noms de fichiers avec espace. Je ne suis pas encore sûr de savoir comment mettre à jour la commande d'alias, je vais donc mettre la version améliorée ici:

git ls-files -z -o --exclude-standard | xargs -0 git add

Je pense que c'est la bonne réponse, car elle fournit le chemin de chaque fichier pour effectuer une action (comme git add) sur eux par la suite
Pablo Burgos

27

Tout est très simple

Pour obtenir la liste de tous les fichiers non suivis, utilisez la commande git status avec l' option -u (--untracked-files)

git status -u

que diriez-vous d'une version non récursive de cela?
David

Malheureusement, il répertorie également les fichiers ignorés via les fichiers .gitignore.
Plouff

8
C'est la seule réponse qui a montré mes fichiers ignorés lors de la validation initiale, mais j'ai dû ajouter --ignoredà la git status -ucommande
DN

C'est simple et agréable.
Eric Wang

1
Cela montre également les fichiers modifiés. Donc, pas de réponse à la question: ne montrer que les fichiers non suivis.
Wildcard

6

Lorsque vous recherchez des fichiers à ajouter potentiellement. La sortie de git showfait cela, mais elle comprend également beaucoup d'autres choses. La commande suivante est utile pour obtenir la même liste de fichiers mais sans tous les autres éléments.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Ceci est utile lorsqu'il est combiné dans un pipeline pour rechercher des fichiers correspondant à un modèle spécifique, puis le rediriger vers git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

Je sais que c'est une vieille question, mais en termes de liste des fichiers non suivis, j'ai pensé en ajouter un autre qui répertorie également les dossiers non suivis:

Vous pouvez utiliser l'opération git clean avec -n (dry run) pour vous montrer quels fichiers il supprimera (y compris les fichiers .gitignore) en:

git clean -xdn

Cela a l'avantage d'afficher tous les fichiers et tous les dossiers qui ne sont pas suivis. Paramètres:

  • x - Affiche tous les fichiers non suivis (y compris ignorés par git et autres, comme la sortie de build etc ...)
  • d - afficher les répertoires non suivis
  • n- et surtout ! - dryrun, c'est-à-dire que vous ne supprimez rien, utilisez simplement le mécanisme de nettoyage pour afficher les résultats.

Il peut être un peu dangereux de le faire comme ça au cas où vous oublieriez le -n. Donc, je l'alias généralement dans git config.


2

Toutes les réponses précédentes que j'ai vérifiées répertorieraient également les fichiers à valider. Voici une solution simple et facile qui ne répertorie que les fichiers qui ne sont pas encore dans le repo et non soumis à .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

ou

git status --porcelain | grep -v '\?\?'

cela ne semble pas bien fonctionner avec les fichiers qui ont un espace dans leur nom
ssc

-2

Je pense que ce sera donc la même chose que l'affiche originale prévue:

git add .


2
Chaque fois que vous le faites git/svn add ., le chaton meurt.
Nakilon

Hé, seulement si vous avez un tas de cruches dans vos copies locales de succursales éloignées;) Créez des succursales locales et vous pouvez git add .en toute impunité!
Tim Fulmer

@Nakilon, c'est pourquoi vous configurez .gitignorecorrectement. Toujours bon à éviter git add ., cependant. Mieux vaut git add -u.
Wildcard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.