how to `git ls-files` for just one directory level.

I believe git ls-tree --name-only [branch] will do what you're looking for.


I think you want git ls-tree HEAD sed'd to taste. The second word of ls-tree's output will be tree for directories, blob for files, commit for submodules, the filename is everything after the ascii tab.

Edit: adapting from @iegik's comment and to better fit the question as asked,

git ls-files . | sed s,/.*,/, | uniq

will list the indexed files starting at the current level and collapse directories to their first component.


To just list the files in the current working directory that are tracked by git, I found that the following is several times faster than using git ls-tree...:

ls | grep -f <(git ls-files)

It would take a little messing around with sed if you also wanted to include directories, something along the lines of:

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)  

assuming you don't have any '/' characters in the names of your files. As well as...

ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)

in order to also list "invisible" (yet-tracked) files.


git ls-tree <tree-ish> is good and all, but I can't figure out how to specify the index as the <tree-ish>. (Although I'm sure there's bound to be some all-caps reference to do just that.)

Anyhow, ls-files implicitly works on the index so I might as well use that:

$ git ls-files | cut -d/ -f1 | uniq

This shows files and directories only in the current directory.

Change cut's -f argument to control depth. For instance, -f-2 (that's dash two) shows files and directories up to two levels deep:

$ git ls-files | cut -d/ -f-2 | uniq

IF you specify the <path> argument to ls-files, make sure to increase -f to accommodate the leading directories:

$ git ls-files foo/bar | cut -d/ -f-3 | uniq

Tags:

Git

Glob

Ls