ChatGPT解决这个技术问题 Extra ChatGPT

How can I make git show a list of the files that are being tracked?

git

Using command line git, how can I make git show a list of the files that are being tracked in the repository?

possible duplicate of List files in local git repo?
I believe it is. But it does not feel right to mark this as dup when this has a better answer.
in a parallel universe, it's uncanny how similar this question is including all the answers, yet each with its own distinctive flair.

T
Tuxdude

If you want to list all the files currently being tracked under the branch master, you could use this command:

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

If you want a list of files that ever existed (i.e. including deleted files):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'

Use git ls-tree -r HEAD --name-only if you want to list files of the current branch
Why are directories not listed?
@NicolasLykkeIversen - git does not version directories directly. Instead it stores files and their paths. ls-tree will output all the versioned files. To better understand this distinction, try staging an empty directory to git. The empty directory will never show up in the staged changes. The only way to version such an empty directory is to actually version a file under the directory. For use cases where you need such an empty placeholder directory in version control, you can create a dummy file under the directory, and version that. I hope the explanation is clear.
Just note, ls-tree master doesn't show the tracked files in staging area.
The command to list all files that ever existed does actually only list files until the point HEAD is currently at and it also ignores cases like renames. So I would instead suggest git log --pretty=format: --name-only --all | sort -u | sed '/^$/d'
v
vonbrand

The files managed by git are shown by git ls-files. Check out its manual page.


That seems to only show files at or below the current directory.
Mind if I edit this to include the relevant sections of the manual page?
@NathanBasanese perhaps you can add another answer with that information.
@LyleZ Perhaps this is intended to be in keeping with ls...or ls -R
@LyleZ Also, this behavior is the same with git ls-tree - it is relative to the pwd.
N
Nathan

The accepted answer only shows files in the current directory's tree. To show all of the tracked files that have been committed (on the current branch), use

git ls-tree --full-tree --name-only -r HEAD

--full-tree makes the command run as if you were in the repo's root directory.

-r recurses into subdirectories. Combined with --full-tree, this gives you all committed, tracked files.

--name-only removes SHA / permission info for when you just want the file paths.

HEAD specifies which branch you want the list of tracked, committed files for. You could change this to master or any other branch name, but HEAD is the commit you have checked out right now.

This is the method from the accepted answer to the ~duplicate question https://stackoverflow.com/a/8533413/4880003.


Nathan, you said "Combined with --full-tree, this gives you all committed, tracked files". Does that mean all files that have ever been committed since the beginning of the repo, or is there some cutoff? The currently accept answer includes a git log command whose output is a couple thousand lines longer than your command. I'm trying to hunt down large files that were committed almost a decade ago so I can prune them from history.
B
Bloody_fool

You might want colored output with this.

I use this one-liner for listing the tracked files and directories in the current directory of the current branch:

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

You might want to add it as an alias:

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

If you want to recursively list files:

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

And an alias:

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

The glr alias you provided looked a bit weird so I made a version more consistent with the format of the first alias you provided: alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'. Tested with git version 2.20.1 on Debian 10.
x
xeruf

Building on the existing answers, you can use tree to view it a little prettier:

git ls-tree --full-tree --name-only -r HEAD | tree --fromfile .

You probably want to paginate this:

git ls-tree --full-tree --name-only -r HEAD | tree -C --fromfile . | ${PAGER:-less}

This certainly deserves a place as tree alias in the git config :)


Thanks for your awesome patch to this answer