Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is there a way to list all files currently under source control in git? (Not just those that have been modified).

share|improve this question
up vote 64 down vote accepted

If you want to list all files for a specific branch, e.g. master:

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

The -r option will let it recurse into subdirectories and print each file currently under version control. You can also specify HEAD instead of master to get the list for any other branch you might be in.

If you want to get a list of all files that ever existed, see here:

git log --pretty=format: --name-status | cut -f2- | sort -u
share|improve this answer
Thanks slhck, exactly what I was after - and useful to know about the second one too. Will mark as correct in 5 and a half minutes when I'm allowed. :-) – Anonymous May 28 '12 at 13:21
Thanks for the answer. I was looking for this. Note that git ls-tree -r master --name-only would do the same as the first option, without needing the cut. Ah, and you can specify HEAD instead of master if you just want this list for whatever branch you are currently on. – maurits Sep 13 '12 at 10:15
Running "git ls-files" will save you a few characters :) – Zain R May 14 '15 at 21:30

The git ls-files command will do what you need.


share|improve this answer
git ls-files instead of git ls-tree -r master --name-only is certainly simpler. – karatedog Oct 22 '13 at 8:14
Sorry but my edit wasn't invalid. In current git there is no git-ls-files binary. There is the git binary with the ls-files command. The link to the documentation is correct in content, but technically for an outdated binary. – JonnyJD Jan 11 '14 at 3:09
@JonnyJD, probably marked invalid because your edit should be a comment. – Ascherer Oct 12 '14 at 20:16

git ls-files will only print files in the current working directory.

If, for instance, you have a git repo for dotfiles (core.worktree = /), then you will have files outside the git root and that simple command won't work anymore.

In short, this will work:

git --git-dir "`git rev-parse --git-dir`" \
    -C "`git config core.worktree || pwd`" \


mkdir ~/dotfiles
cd ~/dotfiles
git config core.worktree /

# Ignore all files by default, else Git will find all files under "/"
echo "*" > .git/info/exclude

# Add files at the git repo's root and somewhere in the work tree
touch README
git add -f README
git add -f /etc/ssh/sshd_config

# `git status` would now print:
# new file:   ../../../etc/ssh/sshd_config
# new file:   README
git status

git commit -m "Initial commit"

# At this point, `git ls-files` prints only:
git ls-files

# But you can print all files inside the work tree. This will print:
# etc/ssh/sshd_config
# home/yourusername/dotfiles/README
git --git-dir "`git rev-parse --git-dir`" -C "`git config core.worktree || pwd`" ls-files
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .