Как получить абсолютный путь ко всем файлам в Git-репозитории с субмодулями? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь перечислить все неотслеживаемые файлы во всех подмодулях рекурсивно:

git submodule foreach --recursive git ls-files --others --exclude-standard --full-name

Но здесь не указан абсолютный путь, он указывает относительный путь к папке подмодуля.

Как мне изменить мою команду?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Спасибо Торек за идею. Это работает:

git submodule foreach --quiet 'a=$(printf "$(git ls-files --others --exclude-standard --full-name|sed "s~^~$(pwd)/~")"; printf x); a=${a%x}; echo "$a"' | sed '/^\s*$/d'
0 голосов
/ 05 сентября 2018

(Примечание: это ответ «инструмента», а не «решения». То есть этот ответ должен дать вам инструменты, которые вам понадобятся для построения решения, которое вы хотите.)

Используйте 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 Логика предполагает, что это будет полный путь; относительный путь не совсем пригоден для использования, не зная, сколько субмодулей было рекурсивно введено. Тем не менее, относительный путь легче создать.

...