63 votes

git : Comment ajouter récursivement tous les fichiers d'un sous-arbre de répertoire qui correspondent à un motif global ?

J'ai plusieurs fichiers .screen à l'intérieur /xxx/documentation et ses sous-répertoires qui sont déjà suivis par Git.

Après avoir modifié plusieurs de ces fichiers d'écran, j'exécute git add documentation/\\*.screen -comme l'indique le premier exemple dans git-add pour mettre en scène ces fichiers, mais la commande échoue :

fatal: pathspec 'documentation/\\\*.screen' did not match any files

Est-ce que ma commande est mauvaise, ou est-ce que git a un bug ?

0 votes

La réponse marquée a fonctionné pour moi, mais il faut noter que chaque caractère de remplacement doit être mis entre guillemets séparément, par exemple git add ' *.cpp *.h' a donné lieu à l'erreur ci-dessus fatal: pathspec ' *.cpp *.h' did not match any files tandis que git add ' *.cpp' '*.h' a fait son travail.

61voto

Greg Bacon Points 50449

C'est un bug dans la documentation. Citez l'astérisque avec

$ git add documentation/\\\*.screen

ou

$ git add 'documentation/\*.screen'

pour obtenir le comportement que vous voulez.

Si, au lieu de cela, vous voulez ajouter les fichiers dans le répertoire courant seulement, utilisez

$ git add \*.screen

UPDATE : J'ai soumis un patch qui corrige le problème, maintenant fixé à partir de la version 1.6.6.2.

0 votes

Ces deux commandes aboutissent-elles au même résultat ? Et si l'on ajoutait seulement les fichiers du répertoire courant mais pas ses sous-répertoires ?

0 votes

Au fait, kubi a mentionné que la commande fonctionnait bien sur sa machine, qu'en dites-vous ?

0 votes

@Phuong Oui, les deux commandes aboutissent au même résultat. Pour ajouter des fichiers uniquement dans le répertoire courant, ne citez pas l'argument, (par exemple, git add *.screen). Je crois que kubi et Aaron ont mal compris votre question car j'ai été surpris d'apprendre (merci de m'y avoir incité !) que git-add possède cette fonctionnalité.

17voto

Flueras Bogdan Points 1838

J'ai essayé la réponse acceptée, mais elle n'a pas fonctionné pour moi alors voici la mienne, au cas où quelqu'un voudrait faire son travail sans passer du temps à disséquer les différents aspects qui pourraient causer le problème :

find documentation -name "*.screen" | xargs git add -u

//L'option -u de git-add ajoute à l'index uniquement les fichiers qui ont été précédemment suivis et modifiés.

0 votes

Dans votre cas, est-ce que documentation le nom d'un répertoire à l'intérieur de l'arbre de travail du repo ou un chemin relatif de l'extérieur de l'arbre de travail vers le toplevel du repo ?

4voto

Aaron Digulla Points 143830

Vous avez dit à l'obus de chercher *.screen (c'est-à-dire exactement cette chaîne - qui n'existe pas - au lieu de ce que vous voulez "tous les fichiers qui se terminent par .screen ). Omettre le \\ afin que le shell puisse faire l'expansion du nom de fichier pour vous.

0 votes

Dans ce manuel, on m'a dit d'ajouter les doubles barres obliques. kernel.org/pub/software/scm/git/docs/git-add.html . Qu'est-ce que vous en dites ?

0 votes

J'ai lu l'exemple et je comprends ce qu'ils veulent faire (ajout récursif) mais alors, pourquoi la commande échoue-t-elle ? L'erreur suggère qu'il n'y a pas de fichier avec l'extension ".screen" dans le répertoire ou que le motif n'est pas développé.

0 votes

C'est bizarre, car lorsque je supprime les doubles barres obliques inversées, la commande ne produit aucune erreur.

4voto

Barnaby Dawson Points 41

C'est ce que je viens d'utiliser pour un problème similaire de git ajoutant tous les fichiers dans un répertoire :

find . | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

Pour la question originale, la commande serait :

find -name "*.screen" | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

Notez que je traite le cas où un nom de fichier entièrement spécifié contient des espaces. C'est pourquoi ma réponse. Modifiez la partie avant le premier | afin de choisir les différents fichiers à ajouter.

3voto

Jackie Points 11

Git add *.java fonctionne pour moi pour ajouter récursivement tous les fichiers java

1 votes

Wow, ça marche pour moi aussi ! Mais seulement s'il n'y a pas .java dans le répertoire actuel. S'il y en a, seuls ces fichiers sont ajoutés.

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