git add с использованием подстановочного знака не работает, как я надеялся - должен ли я переходить в определенные каталоги?

Когда я пытаюсь сделать базовое git add *.erb (или любые простые выражения с подстановочными знаками), git не распознает их (их). В качестве примечания: я никогда не делал этого раньше, поэтому я уверен, что это ошибка новичка, но я не нашел помощи в других сообщениях SO или в списке выпускников моей школы, поэтому я подумал, что этот пост может быть уместен.

Для (другого) примера git status дает мне:

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

Я хотел только промежуточный файл маршрутов, поэтому я попробовал git add *s.rb и не играл в кости. Я нахожусь в корне приложения... нужно ли мне находиться в каталоге, содержащем файлы, к которым я пытаюсь применить выражение с подстановочным знаком? Это было бы болезненно, но... на самом деле... это просто сработало.

Надеюсь, это не должно быть отдельным постом, но есть ли более простой способ использовать подстановочные знаки, когда вам не нужно переходить в конкретный каталог?


person RudyOnRails    schedule 22.08.2012    source источник
comment
При использовании моей оболочки (zsh) я набираю git add *.cpp<TAB>, и оболочка дополняет подстановочные знаки до полных имен файлов. git add **/*.cpp<TAB> делает все cpp файлов в текущем каталоге. Bash может иметь что-то подобное.   -  person simont    schedule 22.08.2012
comment
Bash v4 и выше поддерживает ** для рекурсивного подстановки (wiki.bash-hackers.org/syntax/ extension/globs), поэтому, если вы используете достаточно новую версию bash, git add **/*.rb должен делать то, что вам нужно.   -  person Michael Anderson    schedule 22.08.2012
comment
Спасибо @simont @Michael. Оба они лаяли на правильное дерево. Я использовал git add **/*s.rb и все хорошо!   -  person RudyOnRails    schedule 22.08.2012
comment
@MichaelAnderson Я тоже пробовал git add */*s.rb и преуспел. Действует ли */ как подстановочный знак для одного каталога глубже, а **/ обозначает рекурсивные бесконечные каталоги? Если я должен задать новый вопрос, дайте мне знать!   -  person RudyOnRails    schedule 22.08.2012
comment
Это правильно. */*s.rb будет соответствовать всему, что заканчивается на s.rb на один каталог глубже (а не в текущем каталоге и не глубже). Точно так же */*/*s.rb будет всем, заканчивающимся на s.rb двумя каталогами в глубину, но нигде больше (глубже или мельче).   -  person Michael Anderson    schedule 22.08.2012


Ответы (3)


Поместите его в одинарные кавычки. Это должно работать.

git add '*s.rb'

ОБНОВЛЕНИЕ

После дополнительных испытаний я обнаружил, что могу сделать git add *s.rb даже без кавычек. Это может работать для меня с моей версией git 1.7.10.4 (Mac OSX Lion, homebrew). Мое объяснение состоит в том, что если расширение подстановочных знаков оболочки не соответствует ни одному файлу, оно предоставит исходный нерасширенный аргумент '*s.rb' для git add.

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

Теперь я делаю git add без кавычек.

sh-3.2$ git add *s.rb

На удивление работает!

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
#

Если подстановочный знак не соответствует ни одному файлу, git выдаст эту ошибку.

sh-3.2$ git add *x.rb
fatal: pathspec '*x.rb' did not match any files
person chifung7    schedule 22.08.2012
comment
Добавление к вашему ответу: это потому, что ваша оболочка расширяет подстановочный знак до выполнения команды git. Если вы поместите одинарные кавычки, это не позволит оболочке расширить подстановочный знак. - person Snowball; 22.08.2012
comment
Да, это правильно. С одинарной кавычкой git возьмет '*s.rb' и будет искать файлы, соответствующие этому шаблону. - person chifung7; 22.08.2012
comment
На секунду я обрадовался, потому что думал, что это сработает, но я помню, как пробовал это в прошлом, и снова безуспешно. - person RudyOnRails; 22.08.2012
comment
У меня работает с git версии 1.7.10.4 - person chifung7; 22.08.2012
comment
Кроме того, в зависимости от оболочки, *s.rb без кавычек будет работать при условии, что в текущем каталоге нет фактических совпадений. То есть, если *s.rb ничему не соответствует, оно передается приложению как есть. - person Edward Falk; 03.05.2015
comment
Как ни странно, еще несколько месяцев назад вы могли делать это без кавычек в git-for-windows в mingw. Кое-что изменилось, и теперь требуются кавычки. - person RJFalconer; 10.11.2020

Я не могу заставить рекурсивные глобусы работать на меня, так как моя версия bash слишком старая. Итак, что я делаю, это

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

Работает приятно, и я могу добавить туда другие фильтры, если мне нужно, поэтому, если я хочу добавить все файлы, кроме одного, я могу сделать это.

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

Есть пара других случаев, которые могут быть полезны.

Если вы просто хотите добавить файлы, которые уже существуют в вашем репо, вы можете

git add -u .

Если вы хотите добавить все, то

git add .
person Michael Anderson    schedule 22.08.2012

По моему опыту (может быть, я упустил какую-то опцию или что-то в этом роде), git add просматривает только файлы в текущем каталоге и подкаталоге. Поэтому, если вы хотите добавить все, перейдите в корневой каталог репозитория. Хотя, если репо действительно большое, это может занять некоторое время, особенно если вы не передадите флаг -u.

person Antimony    schedule 22.08.2012