Аргументы 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)
или :/:
в качестве префикса отображает все в списке)
См. Документацию для остальных слов, которые являются довольно мощными инструментами.