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

浪子不回头ぞ 提交于 2019-12-21 03:33:27

问题


I'm using msysgit (1.7.9), and I'm looking for the right invocation of the git ls-files command to show just the (tracked) files and directories at the current level, either from the index, or the current working directory if that's easier.

Essentially it would give a directory listing similar that that you would see on Github. Coming from Windows, I'm not too familiar with the right way of doing the globbing(?).


回答1:


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




回答2:


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




回答3:


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



回答4:


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.




回答5:


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`'


来源:https://stackoverflow.com/questions/10452962/how-to-git-ls-files-for-just-one-directory-level

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