2016-10-20 3 views
4
git ls-files 

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

С: List submodules in a git repository и Remove Lines from File which appear in another File я могу сделать:

git ls-files | grep -Fxvf <(git submodule status | cut -d' ' -f3) 

Есть более короткий путь, используя некоторые команды мерзавца/флаги?

+1

Возможно, нет, поскольку эти подмодули имеют записи дерева в вашем родительском хранилище git. Кажется вполне разумным, что они отображаются 'git ls-files'. Я рекомендую вам рассмотреть возможность применения флага '--no-subodules' для' git ls-files' и отправки патча 'git'; они могли бы просто взять это. – larsks

ответ

1

Я бы настоятельно рекомендовал разбор файла .gitmodules, как правило, безопаснее и намного быстрее, чем git submodule status. Этот файл может быть проанализирован с помощью git config, чтобы гарантировать, что все разборе крайние случаи обрабатываются должным образом - форматирование, пробелы, комментарии и т.д.:

git ls-files | grep -Fxvf <(git config --file .gitmodules --name-only --get-regexp path | cut -d '.' -f2-) 

В качестве альтернативы, файл может быть проанализирован непосредственно до тех пор, как регулярное выражение разработан таким образом, что он не будет соответствовать подмодулям, которые были Commended вне через #:

git ls-files | grep -Fxvf <(grep "^\s*\[submodule " .gitmodules | cut -d '"' -f2) 

Обратите внимание, что git submodule status имеет выходной формат, что делает его трудно правильно разобрать через cut. Двумя основными недостатками являются:

  • поле имени файла будет меняться в зависимости от того, если модуль инициализации или не

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

Смежные вопросы