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