(Примечание: это ответ «инструмента», а не «решения». То есть этот ответ должен дать вам инструменты, которые вам понадобятся для построения решения, которое вы хотите.)
Используйте git rev-parse --show-toplevel
, чтобы получить абсолютный путь к текущему хранилищу. Делайте это в суперпроекте, конечно. Это дает вам первую часть любого префикса пути, но теперь вам понадобится оставшаяся часть.
Как указано в документации git submodule
, в foreach
у вас есть доступ к нескольким переменным, включая $path
:
$path
- имя каталога подмодуля относительно суперпроекта ...
Сразу неясно (вам придется проверить это самостоятельно), является ли $path
кумулятивным в случае рекурсивных подмодулей. То есть, если у суперпроекта A есть подмодуль B по пути top/subB
, $path
будет top/subB
, когда вы находитесь в подмодуле B. Но предположим, что подмодуль B действует как суперпроект для подмодуля C, а собственный путь B равен contained/C
. Будет $path
равным top/subB/contained/C
в подмодуле C или будет contained/C
? 1
В любом случае, когда у вас есть соответствующий префикс, просто используйте что-то вроде sed
, чтобы закрепить его на передней панели, например:
git ls-files --others --exclude-standard --full-name | sed "s,^,$prefix,"
, где $prefix
установлен на соответствующий префикс, который может быть просто $path/
. (Предполагается, что ни одно из имен ваших файлов не содержит встроенной новой строки; в противном случае ваша исходная команда в любом случае испытывает проблемы. Как написано, также предполагается, что ни один из ваших префиксов не содержит запятой - если они есть, используйте символ, отличный от ,
или сделайте $prefix
в кавычках с обратной косой чертой.)
1 Логика предполагает, что это будет полный путь; относительный путь не совсем пригоден для использования, не зная, сколько субмодулей было рекурсивно введено. Тем не менее, относительный путь легче создать.