2012-05-04 5 views
15

저는 msysgit (1.7.9)를 사용하고 있습니다. 색인 또는 현재 작업중인 현재 수준의 (추적 된) 파일 및 디렉토리를 표시하는 git ls-files 명령의 올바른 호출을 찾고 있습니다. 디렉토리가 더 쉬울 수도 있습니다.어떻게`ls-files`를 단지 하나의 디렉토리 레벨로 사용할 것인가?

기본적으로 Github에서 볼 수있는 것과 유사한 디렉토리 목록을 제공합니다. Windows에서 오는, 나는 globbing (?)을하는 올바른 방법에 너무 익숙하지 않다.

답변

14

당신은 git ls-tree HEAD을 맛보고 싶다고 생각합니다. LS-트리의 출력의 두 번째 단어는 submodulesm에 대한 파일 디렉토리에 대한 tree, blob, commit 될 것입니다, 파일 이름이

+1

'git ls-files | awk -F/'{print $ 1}'| 유니크 | xargs ls -dl --color = auto' – iegik

+0

@iegik 이것은 훨씬 좋습니다. 나는 awk 대신에'sed, /. * ,,'를 사용했다. 대답 해주세요, 제발요? 나는 그것을받을 것이다. – jthill

+0

macOS에서 작동하지 않습니다 -'ls : illegal option -'. 적어도 macOS에서는, 당신이 ... "| xargs 'ls'-Gdl' - 누군가 리눅스에서 작동하는지 확인할 수 있습니까? – ELLIOTTCABLE

12

나는 git ls-tree --name-only [branch]이 당신이 찾고있는 것을 할 것이라고 믿습니다.

+1

감사합니다. 그곳에는 95 % 나됩니다. 'git ls-tree --name-only [branch]'는 동일한리스트에있는 디렉토리와 파일을 모두 나열합니다 (즉, 디렉토리의'/'는 뒤에 없습니다). 'git ls-tree -d --name-only [branch]'디렉토리 만 나열합니다. '문제'의 한 부분은 서브 모듈 디렉토리를 찾아내는 것입니다. –

+0

이것은 아마도 허용 된 대답이어야합니다! 그것은 하나를 향한 아주 좋은 출발입니다. : D – ELLIOTTCABLE

+0

@PhilipOakley'git ls-tree'보다는'git ls-files'를 제외하고 비슷한 일을하려고했습니다. 'git ls-files'를 사용하면 해당 옵션이'--directory' 인 것처럼 보입니다 (이 명령에서'-d'는'--deleted'의 약자입니다). –

3

그냥 자식에 의해 추적 현재 작업 디렉토리에있는 파일을 나열하려면 아스키 탭 후 모든 것이,

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq) 
: 나오지도 함께 당신은 또한의 라인을 따라 디렉토리, 뭔가를 포함하기를 원한다면

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

그것은 장난 좀 걸릴 것 : 나는 다음은 git ls-tree...를 사용하는 것보다 몇 배 빠른 것으로 나타났습니다

파일 이름에 '/'문자가 없다고 가정합니다. 뿐만 아니라 순서

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

는 "보이지 않는"목록에 ...로 파일을 (아직 추적).

+0

이것은 좋은 일입니다 ... 나는 왜 그것을 [별칭]'으로 추가 할 수 없는지 궁금합니다. grep -f <(git ls-files | sed의 ////.*// g 'sort | uniq);}; f "'->'fatal : 나쁜 설정 파일 ' –

4

git ls-tree <tree-ish> 좋은 모든이지만, 나는 <tree-ish>인덱스을 지정하는 방법을 알아낼 수 없습니다. (. 내가 확신하지만 일부는 모두 대문자 그냥 그렇게 참조있을 바운스)

어쨌든, ls-files 암시 그래서 그뿐만 아니라 사용할 수있는 인덱스에서 작동 :

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

이 쇼를 파일 및 디렉토리 만 현재 디렉토리에 저장합니다.

제어 깊이를 cut-f 인수로 변경하십시오. 당신이 ls-files<path> 인수를 지정 선두 디렉토리를 수용 할 수 -f을 증가해야합니다 경우

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

: 예를 들어, -f-2 깊은 두 가지 수준의 최대 파일과 디렉토리를 보여줍니다 (즉 대시 두의)

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

['git write-tree'] (https://git-scm.com/docs/git-write-tree)로 색인을위한 트리를 얻을 수 있습니다. – jthill

0

나는 이것이 매우 힘들다는 것에 놀랐지 만, 나는 자식에 대한 나의 열망을 시작하지 않는다.

jthill의 대답에 대한 변형이 별칭이 가능한 것 같습니다 (이봐, 나는 언어 학자 야, 나는 새로운 단어를 만들 수있는 라이센스가있다).변종은

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

인이 사용하는 '1!'(당신이 것을 사용하는 경우) 당신은 색상 코드를 얻을 수 있도록, 등 그것은 또한 별칭으로 작동 출력 형식에 :

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

FWIW, 당신은 또한 'ls'형식을 사용하도록 재귀 적 명령을 별명으로 지정할 수 있습니다 (예 : 경로 + 파일 이름이 너무 길지 않으면 두 개의 열 출력, 실행 파일의 색 코드 등을 얻습니다)

alias gitls-r='ls `git ls-files`'