Git add не работает с файлами .png? - PullRequest
8 голосов
/ 24 мая 2010

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

git add *.png

Но это не добавляет файлы. Было добавлено несколько новых файлов изображений, но ни один из тех, которые были изменены / ранее не были добавлены.

Что дает?

Редактировать : Вот соответствующий вывод терминала

$ git status
# On branch master
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   src/main/java/net/plugins/analysis/FormMatcher.java
#   modified:   src/main/resources/icons/doctor_edit_male.png
#   modified:   src/main/resources/icons/doctor_female.png
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   src/main/resources/icons/arrow_up.png
#   src/main/resources/icons/bullet_arrow_down.png
#   src/main/resources/icons/bullet_arrow_up.png
no changes added to commit (use "git add" and/or "git commit -a")

Затем выполнил «git add * .png» (без вывода после команды)

Тогда:

$ git status
# On branch master
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   src/main/resources/icons/arrow_up.png
#   new file:   src/main/resources/icons/bullet_arrow_down.png
#   new file:   src/main/resources/icons/bullet_arrow_up.png
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   src/main/java/net/plugins/analysis/FormMatcher.java
#   modified:   src/main/resources/icons/doctor_edit_female.png
#   modified:   src/main/resources/icons/doctor_edit_male.png

Ответы [ 5 ]

17 голосов
/ 25 мая 2010

Комментарий Михаила Мрозека, по сути, является ответом. *.png соответствует файлам с таким именем в текущем каталоге, а не в подкаталогах. Если вы хотите добавить их в подкаталог, сделайте так:

git add src/main/resources/icons/*.png

Или, в зависимости от вашей оболочки, вы можете сделать:

git add **/*.png

Дело в том, что это оболочка, которая выполняет глобализацию (расширяет * .png в список имен файлов). Git не имеет к этому никакого отношения; он просто принимает аргументы, которые ему дает оболочка.

Редактировать: Так как это удалось принять, я должен пойти дальше и указать, как и другие, что некоторые команды git поддерживают внутреннюю глобализацию (через fnmatch), поэтому, если вы заключите в кавычки шаблон, он будет передан без изменения оболочка для мерзавца, где будет происходить глобальное расширение.

10 голосов
/ 25 мая 2010

Некоторые команды 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 года кто-то сообщил о симптоме, очень похожем на то, как оператор , сопровождающий Гита объяснил, что он хотел бы видеть в долгосрочной перспективе ).

1 голос
/ 25 мая 2010

В сомнении, попробуйте:

git -A -- *.png 

, что может быть более полным (git add man page )

-A
--all

Like -u, но сопоставьте <filepattern> с файлами в рабочем дереве в дополнение к индексу.
Это означает, что он найдет новые файлы, а также подготовит измененный контент и удалит файлы, которых больше нет в рабочем дереве.

См. Вопрос SO " Разница между" git add -A "и" git add . ""

0 голосов
/ 13 апреля 2012

git ls-files - это хороший способ составить список всего в вашем git-репо

Для вашего случая вы можете сделать что-то вроде

git ls-files --modified | grep '\.png$' | xargs git add

Вывести список измененных файлов, отфильтровать по расширению (.png в этом случае) и git добавьте результирующие записи

0 голосов
/ 26 января 2011

Нечувствительные к регистру файловые системы, такие как настройки Mac OS X по умолчанию, также приведут к хаосу.Если вы измените «directory» на «Directory», у вас не получится распознать git, если вы не перейдете в другую временную папку, зафиксируете, вернетесь назад и подтвердите снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...