Некоторые команды Git (включая git add
) могут обрабатывать шаблоны имен файлов сами.Но сначала вы должны убедиться, что шаблон попадает в Git.
В общем случае шаблоны без кавычек могут не попадать в вызываемую команду.В особом случае, если шаблон не соответствует ни одному файлу (в текущем каталоге, если в шаблоне нет косой черты), bash передаст в команду нерасширенный шаблон (если не установлена опция nullglob
)., в этом случае аргумент шаблона будет удален из аргументов, переданных команде).Но поведение варьируется среди снарядов.По умолчанию zsh выдает ошибку типа «совпадения не найдены», если не установлена опция nomatch
(в качестве аргумента передается нерасширенный шаблон) или не установлена опция null_glob
(удаляет шаблон изсписок аргументов).
Таким образом, использование шаблонов без кавычек и ожидание их попадания в основную команду является надежным только в том случае, если вы знаете поведение вашей оболочки и знаете содержимое любых каталогов, указанных в шаблоне (обычно простотекущий каталог для шаблонов без косой черты).
Итак, для максимальной надежности, если вы хотите, чтобы git add
получил буквенную строку *.png
в качестве аргумента, вы должны заключить его в кавычки.
git add \*.png
git add "*.png"
git add '*'.png
# etc.
Как только вы успешно передали шаблон имени файла в Git, вы столкнетесь с некоторыми отличиями от того, как их обрабатывает оболочка.
Основное различие в этом вопросе состоит в том, что сопоставление выполняется fnmatch (3) без FNM_PATHNAME.Это означает, что шаблон, подобный *.png
, будет соответствовать файлу foo.png
в текущем каталоге (как оболочка), но также будет соответствовать dir/bar.png
(потому что без FNM_PATHNAME *
может совпадать с косой чертой).Git называет свои шаблоны «pathspecs», чтобы отличать их от «glob» шаблонов оболочки.
К сожалению, существует несогласованность в способе, которым git add
обрабатывает pathspecs.Он всегда применяет их к неотслеживаемым файлам, но никогда не применяет их к отслеживаемым файлам (вместо этого аргументы типа имени файла, такие как pathspecs, проверяются только на точное совпадение со списком отслеживаемых файлов).По-видимому, это именно то, с чем на самом деле столкнулся OP, поскольку он добавил бы новые файлы, которые соответствуют спецификации пути, но не смогли бы обновить (уже) отслеживаемые файлы, которые соответствуют спецификации пути.
Jefromi'sОбходной путь (git add **/*.png
) работает до тех пор, пока ваша оболочка поддерживает расширенный шаблон **
(или его эквивалент).
На самом деле вы можете заставить Git работать, но использовать оболочку, вероятно, проще (если вашshell поддерживает это).
# update all tracked files matching the Git pathspec *.png
git ls-files --cached -z \*.png | git update-index --add -z --stdin
Сглаживание внутренней обработки pathspec в Git - это «среднесрочная» цель, но не та, которую кто-либо, имеющий время, интерес и соответствующий опыт, сделал шаг вперед, чтобы исправить.
Она была выдвинута как идея проекта для Google Summer of Code 2010 (никем не подобранная), и связанные с ней проблемы время от времени появляются в списке рассылки (ВВ январе и в марте 2010 года кто-то сообщил о симптоме, очень похожем на то, как оператор , сопровождающий Гита объяснил, что он хотел бы видеть в долгосрочной перспективе ).