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

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

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

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

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

2 ответа

Решение

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

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'

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

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

Другие вопросы по тегам