Как `git ls-files` только для одного уровня каталогов.
Я использую msysgit (1.7.9), и я ищу правильный вызов git ls-files
команда для отображения только (отслеживаемых) файлов и каталогов на текущем уровне, либо из индекса, либо из текущего рабочего каталога, если это проще.
По сути, это даст список каталогов, похожий на тот, что вы увидите на Github. Исходя из Windows, я не слишком хорошо знаю, как правильно делать сглаживание (?).
5 ответов
Я думаю ты хочешь git ls-tree HEAD
sed'd по вкусу. Второе слово вывода ls-tree будет tree
для каталогов, blob
для файлов, commit
для подмодуля имя файла - все после вкладки ascii
Я верю git ls-tree --name-only [branch]
будет делать то, что вы ищете.
Чтобы просто перечислить файлы в текущем рабочем каталоге, которые отслеживаются Git, я обнаружил, что следующее в несколько раз быстрее, чем с помощью git ls-tree...
:
ls | grep -f <(git ls-files)
Было бы немного возиться с sed, если бы вы также хотели включить каталоги, что-то вроде:
ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)
при условии, что в именах ваших файлов нет символов '/'. Так же как...
ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)
для того, чтобы также перечислить "невидимые" (еще отслеживаемые) файлы.
git ls-tree <tree-ish>
это хорошо и все, но я не могу понять, как указать индекс в качестве <tree-ish>
, (Хотя я уверен, что для этого есть ссылка на все заглавные буквы.)
Во всяком случае, ls-files
неявно работает с индексом, так что я мог бы также использовать это:
$ git ls-files | cut -d/ -f1 | uniq
Это показывает файлы и каталоги только в текущем каталоге.
+ Изменить cut
"s -f
аргумент для контроля глубины. Например, -f-2
(это тире два) показывает файлы и каталоги глубиной до двух уровней:
$ git ls-files | cut -d/ -f-2 | uniq
ЕСЛИ вы указываете <path>
аргумент ls-files
, убедитесь, чтобы увеличить -f
для размещения ведущих каталогов:
$ git ls-files foo/bar | cut -d/ -f-3 | uniq
Я удивлен, что это так сложно... но не заставляй меня задуматься о мерзавце.
Вариант ответа jthill кажется псевдонимом (эй, я лингвист, у меня есть лицензия на создание новых слов). Вариант есть
ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`
Он использует 'ls' для форматирования вывода, поэтому вы получаете цветовое кодирование (если вы его используете) и т. Д. Он также работает как псевдоним:
alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`'
FWIW, вы также можете использовать псевдоним рекурсивной команды, чтобы вы использовали форматирование 'ls' (например, если ваши путь + имена файлов не слишком длинные, вы получите два столбца, цветовое кодирование исполняемых файлов и т. Д.)
alias gitls-r='ls `git ls-files`'
Верите или нет, самое простое решение, которое я нашел, - это просто cd
в каталог, который вы хотите в своем терминале. Бегgit ls-files
в /project/src
даст вам результаты только из этого каталога, а не запускает его в /project
Не самый технический ответ, но это работает!
Используйте этот простой сценарий bash для определения подкаталога любого уровня