Git: список отфильтрованных путей от root в подкаталоге - PullRequest
1 голос
/ 22 июня 2019

git diff может перечислить все различия файлов между двумя ревизиями:

$ git diff --name-only master
foo.txt
bar/bar.txt
bar/baz.qux

Он принимает необязательный фильтр <path> в форме шаблона glob, в котором указаны пути для включения:

$ git diff --name-only master -- '*.txt'
foo.txt
bar/bar.txt

<path> относительно рабочего каталога:

$ cd bar/
$ git diff --name-only master --    '*.txt' # no output
$ git diff --name-only master -- '../*.txt'
foo.txt
bar/bar.txt

Есть ли способ вызвать git diff для достижения эффекта

$ cd bar/
$ git diff --name-only master | grep '\.txt$'
foo.txt
bar/bar.txt

, не полагаясь на внешниеинструменты?<path> с префиксом / не работает.

Ответы [ 3 ]

3 голосов
/ 22 июня 2019

Аргументы git diff - это то, что Git называет pathspec , который определен в gitglossary . Вот фрагмент из (довольно длинного) описания:

Спецификация пути, начинающаяся с двоеточия :, имеет особое значение. В краткой форме, за начальным двоеточием : следуют ноль или более букв "магической подписи" (которые необязательно заканчиваются другим двоеточием :), а оставшаяся часть является шаблоном для сопоставления с путем. «Волшебная подпись» состоит из символов ASCII, которые не являются ни буквенно-цифровыми, ни глобальными, ни специальными символами регулярных выражений, ни двоеточиями. Необязательное двоеточие, которое завершает «волшебную подпись», может быть опущено, если шаблон начинается с символа, который не принадлежит к набору символов «волшебная подпись» и не является двоеточием.

В длинной форме, перед двоеточием : следует открывающая скобка (, разделенный запятыми список из нуля или более "магических слов" и закрывающие скобки ), а остаток - образец, чтобы соответствовать пути. ...

top

Следовательно, мы можем использовать :(top) или :/:. Вот та же настройка, что и в вашем примере:

$ git diff --name-only
bar/bar.txt
bar/baz.qux
foo.txt

(все они изменены)

$ cd bar
$ git diff --name-only
bar/bar.txt
bar/baz.qux
foo.txt

(все еще в списке, даже в подкаталоге, если нет пути к файлу)

$ git diff --name-only -- '*.txt'
bar/bar.txt

(указан только один из-за того, что он находится в подкаталоге плюс pathspec). Теперь мы используем спецификаторы pathspec:

$ git diff --name-only -- ':(top)*.txt'
bar/bar.txt
foo.txt
$ git diff --name-only -- ':/:*.txt'
bar/bar.txt
foo.txt

(:(top) или :/: в качестве префикса отображает все в списке)

См. Документацию для остальных слов, которые являются довольно мощными инструментами.

2 голосов
/ 23 июня 2019
$ cd bar/
$ git diff --name-only master -- $(git rev-parse --show-cdup)/'*.txt'
foo.txt
bar/bar.txt

См. https://git -scm.com / docs / git-rev-parse # Документация / git-rev-parse.txt --- show-cdup

2 голосов
/ 22 июня 2019

Возможно, одним из вариантов является изменение на корень хранилища , который можно безопасно выполнить в под-оболочке перед выполнением базовой команды:

$ cd bar/
$ ( cd $(git rev-parse --show-toplevel) &&
    git diff --name-only master -- '*.txt' )
foo.txt
bar/bar.txt

Это не вводит новые внешние инструменты - оболочка предоставляет вложенные оболочки и cd, и предоставляется Git - но технически она не удовлетворяет требованию нет внешних инструментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...