Как я могу заставить git показывать список файлов, которые отслеживаются?

535

Используя командную строку git, как мне сделать так, чтобы git показывал список файлов, которые отслеживаются в хранилище?

RobertL
источник
5
возможный дубликат файлов списка в локальном репозитории git?
Кристьян
2
Я верю, что это так. Но не очень правильно отмечать это как dup, когда у этого есть лучший ответ.
Линде
5
в параллельной вселенной странно, насколько похож этот вопрос , включая все ответы, но у каждого свой особый характер.
Джефф Пакетт

Ответы:

628

Если вы хотите перечислить все файлы, которые в настоящее время отслеживаются в ветви master, вы можете использовать эту команду:

git ls-tree -r master --name-only

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

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
Tuxdude
источник
61
Используйте git ls-tree -r HEAD --name-only, если вы хотите получить список файлов текущей ветки
Ramast
3
Почему каталоги не перечислены?
Shuzheng
13
@NicolasLykkeIversen - gitне создает версии каталогов напрямую. Вместо этого он хранит файлы и их пути. ls-treeвыведет все версионные файлы. Чтобы лучше понять это различие, попробуйте установить пустой каталог в git. Пустой каталог никогда не будет отображаться в поэтапных изменениях. Единственный способ создать версию такого пустого каталога - это на самом деле создать файл в этом каталоге. Для случаев использования, когда вам нужен такой пустой каталог-заполнитель в управлении версиями, вы можете создать фиктивный файл в каталоге и версию. Я надеюсь, что объяснение понятно.
Tuxdude
2
Просто обратите внимание, ls-tree masterне отображаются отслеживаемые файлы в области подготовки.
nn0p
Можно ли показать только каталог верхнего уровня, если он содержит много подкаталогов и файлов?
Блазард
192

Файлы, которыми управляет git, показаны как git ls-files. Проверьте его страницу руководства.

vonbrand
источник
4
Это, кажется, показывает только файлы в или ниже текущего каталога.
Lyle Z
11
Не возражаете, если я отредактирую это, чтобы включить соответствующие разделы страницы руководства?
Натан Басанезе
1
@NathanBasanese, возможно, вы можете добавить еще один ответ с этой информацией.
Хосе Кастро
@LyleZ Возможно, это должно соответствовать ls... илиls -R
flow2k
1
@LyleZ Кроме того, это поведение то же самое с git ls-tree- это относительно pwd.
flow2k
18

Принятый ответ показывает только файлы в дереве текущего каталога. Чтобы показать все отслеженные файлы, которые были зафиксированы (в текущей ветви), используйте

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree заставляет команду работать так, как если бы вы находились в корневом каталоге хранилища.
  • -rвозвращается в подкаталоги. В сочетании с --full-treeэтим вы получаете все зафиксированные и отслеживаемые файлы.
  • --name-only удаляет SHA / информацию о разрешениях, когда вам просто нужны пути к файлам.
  • HEADуказывает, для какой ветви вы хотите получить список отслеживаемых, зафиксированных файлов. Вы можете изменить это masterили любое другое имя ветки, но HEADэто фиксация, которую вы извлекли прямо сейчас.

Это метод из принятого ответа на дубликат вопроса https://stackoverflow.com/a/8533413/4880003 .

Натан
источник
Спасибо! Это также работает для голых репо.
hzpc-joostk
5

Вы могли бы хотеть цветной вывод с этим.

Я использую этот однострочный список для отслеживания отслеживаемых файлов и каталогов в текущем каталоге текущей ветви:

ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)

Вы можете добавить его как псевдоним:

alias gl='ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)'

Если вы хотите рекурсивно перечислить файлы:

'ls' --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)

И псевдоним:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"
Кровавый дурак
источник
glrПсевдоним вы при условии , что выглядело немного странно , так что я сделал вариант более соответствует формату первого псевдонима вы предоставили: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Проверено git version 2.20.1на Debian 10.
baltakatei