Как `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 для определения подкаталога любого уровня

Другие вопросы по тегам