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?

Nous sommes tous Monica
la source
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

takhin
la source
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.

Dustin
la source
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é.

Mike Lococo
la source
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
youurayy
la source
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
Valentyna
la source
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
cmac
la source
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.

code_fodder
la source
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 '\?\?'
Frank-Rene Schäfer
la source
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 .

Tim Fulmer
la source
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