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

痞子三分冷 提交于 2019-12-04 22:43:50

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 submodulesm, the filename is everything after the ascii tab

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

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
AlexJWR

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.

I'm surprised this is so hard... but don't get me started on my griping about git.

A variant on jthill's answer seems to be aliasable (hey, I'm a linguist, I have a license to make new words). The variant is

ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`

This uses 'ls' to format the output, so you get color coding (if you use that), etc. It also works as an alias:

alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`'

FWIW, you can also alias the recursive command, so that you used the 'ls' formatting (e.g. if your path+filenames aren't too long, you'll get two column output, color coding of executables, etc.)

alias gitls-r='ls `git ls-files`'
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!