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
, который является путем подмодуля относительно каталога верхнего уровня родительского проекта.