web-dev-qa-db-fra.com

"git add" utilisant un caractère générique ne fonctionne pas comme je l'espérais - dois-je cd dans des répertoires spécifiques?

Quand j'essaie de faire un --- git add * .erb (ou toute autre expression générique simple) git ne le reconnaît pas (eux). En remarque, je n'ai jamais fait cela auparavant, donc je suis sûr que c'est une erreur de débutant, mais je n'ai trouvé aucune aide dans d'autres SO posts ou la liste de diffusion des anciens de mon école, alors j'ai pensé ce poste peut être approprié.

Pour (un autre) exemple, git status me donne:

#   modified:   config/routes.rb
#   modified:   spec/models/question_spec.rb

Je voulais seulement mettre en scène le fichier des routes, j'ai donc essayé git add * s.rb et pas de dés. Je suis à la racine de l'application ... dois-je être dans le répertoire qui contient le ou les fichiers auxquels j'essaie d'appliquer l'expression générique? Ce serait douloureux, mais ... en fait ... ça a juste fonctionné.

J'espère que cela ne doit pas être un article séparé, mais existe-t-il un moyen plus simple d'utiliser des caractères génériques où vous n'avez pas besoin de cd dans le répertoire spécifique?

45
RudyOnRails

Mettez-le autour de guillemets simples. Cela devrait fonctionner.

git add '*s.rb'

MISE À JOUR

Après plus de tests, je découvre que je peux même faire git add *s.rb sans citations. Cela pourrait bien fonctionner pour moi avec ma version git 1.7.10.4 (Mac OSX Lion, homebrew). Mon explication est que si l'expansion des caractères génériques Shell ne correspond à aucun fichier, elle fournirait l'argument non développé d'origine '* s.rb' à git add.

sh-3.2$ git status
#
#   modified:   config/routes.rb
#   modified:   spec/models/products_spec.rb
#

Maintenant oui git add sans citations.

sh-3.2$ git add *s.rb

Étonnamment, cela fonctionne!

sh-3.2$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   config/routes.rb
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   spec/models/products_spec.rb
#

Si le motif générique ne correspond à aucun fichier, git affichera cette erreur.

sh-3.2$ git add *x.rb
fatal: pathspec '*x.rb' did not match any files
70
user673207

Je ne peux pas faire fonctionner les globes récursifs pour moi car ma version de bash est trop ancienne. Donc ce que je fais c'est

find . -name "*.rb" | xargs git add

Fonctionne comme un régal et je peux y ajouter d'autres filtres si j'ai besoin - donc si je veux ajouter tous les fichiers sauf un, je peux le faire.

find . -name "*.rb" | grep -v "not_me.rb" | xargs git add

Il y a quelques autres cas qui peuvent être utiles.

Si vous souhaitez simplement ajouter des fichiers qui existent déjà dans votre référentiel, vous pouvez

git add -u .

Si vous voulez tout ajouter,

git add .
5
Michael Anderson

D'après mon expérience (il me manque peut-être une option ou quelque chose), git add ne regarde que les fichiers du répertoire et du sous-répertoire actuels. Donc, si vous voulez tout ajouter, allez dans le répertoire racine du dépôt. Bien que si le dépôt est vraiment important, cela pourrait prendre un certain temps, surtout si vous ne passez pas le drapeau -u.

0
Antimony