У меня есть Git-репозиторий, в котором есть несколько подмодулей. Как мне перечислить имена всех подмодулей после git submodule init
запуска?
Команда git submodule foreach
может отображать имена подмодулей, но это работает только после того, как они были извлечены, чего не произошло после шага инициализации. Есть еще несколько шагов в цепочке, которые необходимо выполнить, прежде чем их можно будет извлечь, и я не хочу жестко привязывать имена подмодулей к сценарию.
Так есть ли команда Git, чтобы получить имена всех зарегистрированных в настоящее время, но еще не проверенных подмодулей?
git
git-submodules
tpg2114
источник
источник
git submodule
ведет себя так, как я ожидал от гипотетическогоgit submodule list
поведения - я просто никогда не думал проверять, что происходит без аргументовgit submodule
. (Рад, что я проверил эту ссылку, так как изначально я получил неправильную ссылку «Поделиться»!)git submodule list
что не существовало иgit submodule help
не помогло (согласно последнему, решениеgit submodule
не является допустимым использованием).paths
, а не вnames
прерываниях, когда они содержат специальные символы. Я попытался дать ответ для имен и путей, которые должны быть безопасными: stackoverflow.com/a/56912913/3215929Ответы:
Вы можете использовать тот же механизм, что и
git submodule init
сам, а именно посмотреть.gitmodules
. Эти файлы перечисляют каждый путь субмодуля и URL-адрес, на который он ссылается.Например, из корня хранилища,
cat .gitmodules
будет выводить содержимое на экран (при условии, что у вас естьcat
).Поскольку файлы .gitmodule имеют формат конфигурации Git, вы можете использовать git config для разбора этих файлов:
Покажет вам все записи субмодуля, и с
вы получите только сам путь субмодуля.
источник
cat .gitmodules
в корне хранилища ...awk
Часть терпит неудачу , если у вас есть пробелы в пути подмодуль.awk
не работает для подмодулей с пробелами! Команду следует прочитатьgit config -z --file .gitmodules --get-regexp '\.path$' | sed -nz 's/^[^\n]*\n//p' | tr '\0' '\n'
(нужно современноеsed
с-z
). Это невозможно для путей с символами новой строки в них (они могут быть созданы с помощьюgit mv
). Если вы хотите быть в безопасности от них, оставьте| tr '\0' '\n'
и используйте что-то вроде... | while IFS='' read -d '' path; do ...
для дальнейшей обработки с помощью bash. Для этого нужен современный bash, который понимаетread -d ''
(не забывайте пространство между-d
и''
).Вы можете использовать
git submodule status
или опционально,git submodule status --recursive
если хотите показать вложенные подмодули.Из документации Git:
источник
git submodule update --init --recursive
чтобы инициализировать все подмодули.git
команды без помощи bash. И это решение элегантно в том смысле, что оно хорошо работает в любой точке рабочей копии (но, конечно, сами подмодули, результат которых применяется непосредственно к себе).git submodule
аргументы без аргументов совпадаютgit submodule status
, поэтому вы можете сэкономить, набрав 7 символов ;-)git submodule status --recursive
работает, ноgit submodule --recursive
не делает. Эти 7 персонажей действительно что-то покупают. Это зависит от ваших потребностей, хотя.Чтобы вернуть только имена зарегистрированных подмодулей, вы можете использовать эту команду:
Думайте об этом как о том,
git submodule --list
чего не существует.источник
perl -ne '/^\s*path =\s*(.*)/ and push(@submods, $1); END { print(join("\n", sort(@submods)));}' "$(git rev-parse --show-toplevel)/.gitmodules"
который по сравнению с этим ответом (1) работает из любого подкаталога (хотя и не внутри подмодуля); (2) сортирует подмодули по имени; и (3) игнорирует закомментированные строки в .gitmodules.path
может присутствовать в имени подмодуля (git submodule add https://github.com/commercialhaskell/path.git
). Но вы, наверное, уже знали это раньше. Если вы хотите получить доступ.gitconfig
из любой точки рабочего дерева или вам нужно запустить его в--bare
репозитории, вы можете использовать что-то вродеgit cat-file -p HEAD:.gitmodules | ...
. Если вам нужно обратиться к «подготовленному» файлу, вы можете это сделатьgit cat-file -p :.gitmodules | ...
, однако для этого нужен gitindex
.Следующая команда выведет список подмодулей:
Вывод примерно такой:
Примечание: требуется Git 2.7.0 или выше.
источник
git ls-files --stage | grep ^160000
(из Ответа stackoverflow.com/a/29325219 ), кажется, дает тот же результат, так что, возможно, это хорошая замена, если вам нужно быть совместимым со старыми гитами.--
двойныеsubmodule--helper
Использование:
В нем будут перечислены все подмодули в указанном Git-репозитории.
источник
git submodule [status]
(обратите внимание, чтоstatus
подразумевается, если опущен, так что это то же самое).fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'
, Сначала вы должны удалить все внутренние репозитории, которые еще не запланированы.--recursive
флаг, вы должны явно добавитьstatus
команду:git submodule status --recursive
работает, ноgit submodule --recursive
не делает.Я использую это:
источник
Я заметил, что команда, предоставленная в ответе на этот вопрос, дала мне информацию, которую я искал:
В .gitmodule не найдено отображение подмодулей для пути, который не является подмодулем
источник
git ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
.gimodules
или ничего в.git/config
. (Я не уверен, как это произошло, я получил хранилище в этом состоянии. Это была какая-то ошибка, поэтому решение былоgit rm
.)grep "^160000 "
будет чуть более крепкой.Если вы не против работать только с инициализированными подмодулями, вы можете использовать их,
git submodule foreach
чтобы избежать разбора текста.источник
Ты можешь использовать:
источник
test (master)
(имя с пробелом, за которым следуют скобки), который является допустимым именем подмодуля . Команда также не может быть исправлена, потому что git либо печатает,module
либоmodule (branch)
. И это еще хуже, поскольку эта команда не является фарфоровой, поэтому выходные данные команды могут измениться в будущем без предварительного уведомления.Я использую это:
Выход (путь + версия):
источник
Чтобы вывести список всех подмодулей по имени:
git submodule --quiet foreach --recursive 'echo $name'
источник
Это сработало для меня:
Он основан на этой замечательной статье: Понимание Git Submodules
Это должно прочитать
grep ^160000
.источник
git ls-files --stage | grep ^160000
Кажется, выводит тот же вывод, что иgit submodule--helper list
из ответа stackoverflow.com/a/40877379👍🏼
источник
.url
ключами, поэтому могут отображаться и другие записи (обычно их нет, но случается дерьмо). Вы должны использовать--local
здесь, потому что вы не хотите видеть--global
и--system
настройки. И последнее, на что следует обратить внимание, поскольку его можно пропустить, он работает только для подмодулей, которые уже присутствуют.git/config
(например, послеgit submodule init
, см. Вопрос).git config
позволяет указать файл конфигурации.И
.gitmodules
это конфигурационный файл.Итак, с помощью « использовать пробел в качестве разделителя с командой cut »:
Это будет перечислять только пути, по одному на объявленный подмодуль.
Как Tino указывает в комментариях :
В качестве более надежной альтернативы Тино предлагает:
источник
git submodule add https://github.com/hilbix/bashy.git "sub module"; git mv 'sub module' $'sub\nmodule'
). Смотрите мой комментарий к принятому ответу, который очень похож на ваш.В моей версии Git [1] каждый подмодуль Git имеет a
name
и apath
. Они не обязательно должны быть одинаковыми [2] . Получение обоих надежным способом без проверки подмодулей first (git update --init
) - сложная задача волшебника оболочки.Получить список субмодулей
names
Я не нашел способ, как добиться этого с помощью
git config
или любой другойgit
команды. Поэтому мы вернулись к регулярному выражению.gitmodules
(супер уродливо). Но это кажется несколько безопасным, посколькуgit
ограничивает возможное пространство кода, разрешенное для подмодуляnames
. Кроме того, поскольку вы, вероятно, захотите использовать этот список для дальнейшей обработки оболочки, решение нижеNULL
содержит отдельные записи с -bytes (\0
).И в вашем сценарии:
Примечание :
read -rd ''
требуетbash
и не будет работать сsh
.Получить список субмодулей
paths
В моем подходе я стараюсь не обрабатывать выход из
git config --get-regexp
сawk
,tr
,sed
, ... , но вместо того, чтобы передать его нулевые байты отделенными обратноgit config --get
. Это сделано для того, чтобы избежать проблем с символами новой строки, пробелами и другими специальными символами (например, Unicode) в подмодулеpaths
. Кроме того, поскольку вы, вероятно, захотите использовать этот список для дальнейшей обработки оболочки, решение нижеNULL
содержит отдельные записи с -bytes (\0
).Например, в скрипте Bash вы можете:
Примечание :
read -rd ''
требуетbash
и не будет работать сsh
.Сноски
[1] Git версия
[2] Подмодуль с расходящимися
name
иpath
Настроить тестовый репозиторий:
Переместите субмодуль для создания
name
иpath
расхождения:тестирование
Настроить тестовый репозиторий:
.gitmodules
:Получить список подмодулей
names
Получить список подмодулей
paths
источник
Если нет никакого
.gitmodules
файла, но конфигурация подмодулей существует в.git/modules/
:источник
Вот еще один способ проанализировать имена подмодулей Git из .gitmodules без необходимости использования sed или необычных настроек IFS. :-)
источник