Список подмодулей в 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 config --list|egrep ^submodule

Я вижу, что ответ был выбран, но, для тех, кто достигает этой странице:

$ git submodule

перечислит все подмодули в указанном репозитории git.

Ура


вы можете использовать:

git submodule | awk '{ print  }'

Я использую этот:

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 '').


перечислить все подмодули с помощью path

git submodule --quiet foreach --recursive 'echo $name'


если нет .gitmodules, но конфигурация подмодулей существует .git / modules/

find .git/modules/ -name config -exec grep url {} \;