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/ expansion/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

Не мога да накарам рекурсивните globs да работят за мен, тъй като моята версия на 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