GIT: поиск списка файлов (например, с использованием git ls-файлов), включая подмодули

Я пытался выяснить, как получить список всех файлов в репозитории git, включая те, которые содержатся в подмодулях. В настоящее время, git ls-files обеспечит каталог подмодуля верхнего уровня, но не файлы, содержащиеся в подмодуле. При дальнейшем расследовании я обнаружил, что с помощью git submodule, вы можете рекурсивно найти все подмодули, а затем перейти к git ls-files с помощью:

git submodule --quiet foreach --recursive "git ls-files"

Единственная проблема с этим заключается в том, что в результатах указан путь из подмодуля, но мне нужен полный путь из репо. Так что для следующего

например, /some/path/to/gitrepo/source/submodule/[file1, file2]

Что я вижу это:

file1
file2

То, что я хотел бы видеть это:

source/submodule/file1
source/submodule/file2

Есть ли способ сделать это? Из документации есть некоторые предопределенные переменные ($name, $path, $sha1 и $toplevel), но я не уверен, как их использовать для получения желаемых результатов.

2 ответа

Другой подход возможен с Git 2.11+ (4 квартал 2016 г.)

git ls-files --recurse-submodules

См. Коммит 75a6315, коммит 07c01b9, коммит e77aa33, коммит 74866d7 (07 октября 2016 г.) Брэндоном Уильямсом ( mbrandonw )
(Объединено Юнио С Хамано - gitster - в коммите 1c2b1f7, 26 октября 2016 г.)

ls-files: опционально рекурсировать в подмодули

" git ls-files " научился " --recurse-submodules msgstr "опция, которую можно использовать для получения списка отслеживаемых файлов по подмодулям (т.е. это работает только с") --cached msgstr "опция, а не для отображения неотслеживаемых или игнорируемых файлов).

Это был бы полезный инструмент, расположенный на входной стороне канала, который читается с помощью xargs, для работы со всеми файлами рабочего дерева из суперпроекта верхнего уровня.

Как показано в этом тесте, вывод будет включать полный путь к файлу, начиная с основного родительского репо.

git ls-files документация теперь включает в себя:

--recurse-submodules

Рекурсивно вызывает ls-файлы для каждого подмодуля в хранилище.
В настоящее время поддерживается только режим --cached.


Git 2.13 (Q2 2017) добавляет к ls-files --recurse-submodules надежность:

Смотрите коммит 2cfe66a, коммит 2e5d650 (13 апреля 2017 г.) от Jacob Keller ( jacob-keller )
(Объединено Юнио С Хамано - gitster - в коммите 2d646e3, 24 апреля 2017 г.)

ls-files: исправить recurse-submodules с вложенными подмодулями

Так как commit e77aa33 ("ls-files: опционально рекурсировать в подмодули", 2016-10-07, git 2.11) ls-files знал, как переходить в подмодули при отображении файлов.

К сожалению, это не удается в некоторых случаях, в том числе при вложении более одного подмодуля, вызываемого из подмодуля, который сам имеет подмодули, или когда GIT_DIR Переменная environemnt установлена.

До совершения b58a68c (" setup: разрешить передачу префикса командам git ", 2017-03-17, git 2.13-rc0) это привело к ошибке, указывающей, что --prefix а также --super-prefix были несовместимы.

После этого коммита, процесс зацикливается навсегда с GIT_DIR установить родительский и непрерывно читает родительские файлы субмодулей и повторяется навсегда.

Исправьте это, правильно подготовив среду для подмодулей при настройке дочернего процесса. Это похоже на поведение других команд, таких как grep.

Посмотрите на git submodule документация, в которой говорится:

foreach

Оценивает произвольную команду оболочки в каждом извлеченном подмодуле. Команда имеет доступ к переменным $name, $path, $sha1 а также $toplevel: $name имя соответствующего раздела субмодуля в.gitmodules, $path имя каталога подмодуля относительно суперпроекта, $sha1 это фиксация, записанная в суперпроекте, и $toplevel это абсолютный путь к верхнему уровню суперпроекта.

Учитывая приведенную выше информацию, вы можете сделать что-то вроде:

git submodule foreach 'git ls-files | sed "s|^|$path/|"'

В этом примере мы просто берем вывод git ls-files в подмодуле и используя sed предварять значение $path, который является путем подмодуля относительно каталога верхнего уровня родительского проекта.

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