Список подмодулей в Git-репозиторий
у меня есть репозиторий Git, в котором есть несколько подмодулей. Как перечислить имена всех подмодулей после git submodule init
была запущена?
на git submodule foreach
команда может повторять имена подмодуля, но это работает только после того, как они были проверены, что не произошло после шага инициализации. Есть больше шагов в цепочке, которые должны произойти, прежде чем их можно будет проверить, и я не хочу иметь жесткие имена подмодулей в сценарии.
Итак, есть ли команда Git для получения имен всех зарегистрированных в настоящее время, но еще не проверенных подмодулей?
15 ответов
вы можете использовать тот же механизм, что и git submodule init
использует себя, а именно, посмотрите на .gitmodules
. Эти файлы перечисляют каждый путь подмодуля и URL-адрес, на который он ссылается.
например, из корня репозитория, cat .gitmodules
будет печатать содержимое на экране (при условии, что у вас есть cat
).
потому что .файлы gitmodule имеют формат конфигурации Git, вы можете использовать git config для анализа этих файлов:
git config --file .gitmodules --name-only --get-regexp path
покажет вам все записи подмодуля, и с
git config --file .gitmodules --get-regexp path | awk '{ print }'
вы получите только сам путь подмодуля.
чтобы вернуть только имена зарегистрированных подмодулей, вы можете использовать следующую команду:
grep path .gitmodules | sed 's/.*= //'
думайте об этом как git submodule --list
, которого не существует.
можно использовать git submodule status
и дополнительно git submodule status --recursive
Если вы хотите показать вложенные подмодулей.
из документов git SCM:
показать состояние подмодулей. Это напечатает SHA-1 в настоящее время проверено commit для каждого подмодуля вместе с путь подмодуля и выход git описывают для SHA-1. Каждый SHA-1 будет иметь префикс - если подмодуль не инициализирован, + если текущий выделенный подмодуль commit не совпадает ша-1 найден в индексе содержащего репозитория и U, если подмодуль есть конфликты слияния.
следующая команда перечислит подмодули:
git submodule--helper list
вывод примерно такой:
<mode> <sha1> <stage> <location>
Примечание: требуется git 2.7.0 или выше.
Я заметил, что команда, представленная в ответе на этот вопрос, дала мне информацию, которую я искал:
отображение подмодулей не найдено .gitmodule для пути, который не является подмодулем
git ls-files --stage | grep 160000
Я вижу, что ответ был выбран, но, для тех, кто достигает этой странице:
$ git submodule
перечислит все подмодули в указанном репозитории git.
Ура
Я использую этот:
git submodule status | cut -d' ' -f3-4
выход (путь + версия):
tools/deploy_utils (0.2.4)
Если вы не против работать только с инициализированными подмодулями, вы можете использовать git submodule foreach
чтобы избежать разбора текста.
git submodule foreach --quiet 'echo $name'
просто на пути субмодуль пожалуйста, мэм...
git config --list | grep \^submodule | cut -f 2 -d .
Vendor/BaseModel Vendor/ObjectMatcher Vendor/OrderedDictionary Vendor/_ObjC Vendor/XCodeHelpers
это сработало для меня:
git ls-files --stage | grep ^160000
на основе этой замечательной статьи:http://www.speirs.org/blog/2009/5/11/understanding-git-submodules.html
Edit: он должен читать grep ^160000
git config
позволяет указать конфигурационный файл.
И .gitmodules
is файл config.
Итак, с помощью "используйте пробел в качестве разделителя с командой cut":
git config --file=.gitmodules --get-regexp ^^submodule.*\.path$ | cut -d " " -f 2
это будет список только путей, по одному на объявленный подмодуль.
As и указывает в комментариях:
- это не удается для подмодулей с помещения в нем.
пути подмодулей могут содержать newlines, а в
git submodule add https://github.com/hilbix/bashy.git "sub module" git mv 'sub module' $'sub\nmodule'
в качестве более надежной альтернативы Tino предлагает:
git config -z --file .gitmodules --get-regexp '\.path$' | \ sed -nz 's/^[^\n]*\n//p' | \ tr '' '\n'
для путей с новыми линиями в них (они могут быть созданы с помощью
git mv
), оставить у| tr '' '\n'
и использовать что-то вроде... | while IFS='' read -d '' path; do ...
для дальнейшей обработки с bash.
Для этого нужен современный bash, который понимаетread -d ''
(не забывайте о пространстве между-d and ''
).
если нет .gitmodules, но конфигурация подмодулей существует .git / modules/
find .git/modules/ -name config -exec grep url {} \;