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`" \
ls-files
Example:
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:
# README
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
If you want paths specified relative to your current (shell) directory, this does the job:
alias gls='git ls-tree -r master --name-only HEAD "`git config core.worktree`"'
and in the example above, it would print
README
../../../etc/ssh/sshd_config