Using command line git, how can I make git show a list of the files that are being tracked in the repository?
-
5possible duplicate of [List files in local git repo?](http://stackoverflow.com/questions/8533202/list-files-in-local-git-repo) – Kristján Sep 28 '15 at 15:54
-
3I believe it is. But it does not feel right to mark this as dup when this has a better answer. – lindhe Mar 30 '16 at 20:25
-
8in a parallel universe, it's uncanny how similar [this question](https://superuser.com/q/429693/571125) is including all the answers, yet each with its own distinctive flair. – Jeff Puckett Apr 10 '17 at 02:45
-
1@lindhe: it's almost like the StackExchange obsession with closing duplicates is not 100% sensible – iconoclast Feb 25 '23 at 20:48
5 Answers
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'

- 47,485
- 15
- 109
- 110
-
104Use git ls-tree -r HEAD --name-only if you want to list files of the current branch – Ramast Mar 18 '15 at 05:32
-
5
-
18@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. – Tuxdude Mar 31 '16 at 18:22
-
3Just note, `ls-tree master` doesn't show the **tracked** files in staging area. – nn0p Apr 18 '16 at 08:05
-
Is it possible to show just the top-level directory if it includes many subdirectories and files? – Blaszard Oct 25 '17 at 18:54
-
1The 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'` – mic Nov 27 '17 at 13:56
-
1`git ls-tree -r master --name-only` unfortunately does NOT show tracked files which are in `.gitignore`d folders. This is unfortunate, as I've forcefully added with `git add -f ./UNTRACKED_FOLDER/file_I_need_to_track_anyway` a few files I want to verify are truly tracked. – Gabriel Staples Oct 20 '18 at 16:16
-
UPDATE: Awesome! The answer by @vonbrand *does* work for me! `git ls-files` does show these files. – Gabriel Staples Oct 20 '18 at 16:18
-
-
Variation on a theme - all files that have ever been anywhere that result in files currently in the given directory (not very quick but handles renames into the dir and useful for slicing up repos): git ls-files sheetbuilder | xargs --max-lines=1 git log --follow --pretty=format: --name-only | sort | uniq | sed '/^$/d' – Richard Wheeldon Feb 28 '22 at 19:30
-
The files managed by git are shown by git ls-files
. Check out its manual page.

- 11,412
- 8
- 32
- 52
-
6
-
12Mind if I edit this to include the relevant sections of the manual page? – Nathan Basanese Aug 24 '15 at 17:51
-
2@NathanBasanese perhaps you can add another answer with that information. – José Castro Jun 29 '16 at 09:34
-
@LyleZ Perhaps this is intended to be in keeping with `ls`...or `ls -R` – flow2k Apr 19 '17 at 00:14
-
1@LyleZ Also, this behavior is the same with `git ls-tree` - it is relative to the `pwd`. – flow2k Apr 19 '17 at 00:19
-
@LyleZ - I can see files in children folders of the current directory also. – Safwan Sep 10 '19 at 06:22
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 tomaster
or any other branch name, butHEAD
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.

- 9,651
- 4
- 45
- 65
-
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. – Ungeheuer Feb 02 '22 at 00:58
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)"

- 166
- 3
- 3
-
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. – baltakatei May 28 '20 at 21:56
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 :)

- 2,602
- 1
- 25
- 48