2012-05-04 13 views
15

Tôi đang sử dụng msysgit (1.7.9) và tôi đang tìm kiếm lệnh gọi thích hợp của lệnh git ls-files để chỉ hiển thị các tệp và thư mục được theo dõi ở cấp hiện tại, từ chỉ mục hoặc công việc hiện tại thư mục nếu điều đó dễ dàng hơn.cách `git ls-files` chỉ với một cấp thư mục.

Về cơ bản nó sẽ cung cấp cho một danh sách thư mục tương tự mà bạn sẽ thấy trên Github. Đến từ Windows, tôi không quá quen thuộc với cách làm đúng cách của globbing (?).

Trả lời

14

Tôi nghĩ bạn muốn git ls-tree HEAD muốn nếm thử. Từ thứ hai của đầu ra ls-cây sẽ là tree cho thư mục, blob cho các tập tin, commit cho submodulesm, tên tập tin là tất cả mọi thứ sau khi tab ascii

+1

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

+0

@iegik Điều này tốt hơn nhiều. Tôi muốn 'sed s, /. * ,,' thay vì vụng về, chỉ vì nó ngắn hơn. Làm cho câu trả lời này được không? Tôi sẽ thưởng cho nó. – jthill

+0

Không hoạt động trên macOS - 'ls: tùy chọn bất hợp pháp - -'. Tôi nghĩ rằng bạn muốn, ít nhất là trên macOS, '... | xargs 'ls' -Gdl' - ai đó khác cũng có thể kiểm tra xem nó có hoạt động trên Linux không? – ELLIOTTCABLE

12

Tôi tin rằng git ls-tree --name-only [branch] sẽ làm những gì bạn đang tìm kiếm.

+1

Cảm ơn, đó là 95% theo cách đó. 'Git ls-tree - name-only [branch]' liệt kê cả các thư mục và tập tin trong cùng một danh sách (tức là không có dấu "/" cho các thư mục). Tôi tìm thấy 'git ls-tree -d - name-only [branch]' sẽ chỉ liệt kê các thư mục. Một phần của 'vấn đề' là phát hiện các thư mục con. –

+0

Điều này có lẽ là câu trả lời được chấp nhận! Điều đó, hoặc đó là một khởi đầu rất tốt đối với một. : D – ELLIOTTCABLE

+0

@PhilipOakley Tôi đã cố gắng để làm một điều tương tự, ngoại trừ với 'git ls-files' hơn là' git ls-tree'. Với 'git ls-files', có vẻ như tùy chọn tương đương là' --directory' (trong lệnh đó, '-d' là viết tắt của' --deleted'). –

3

Để chỉ liệt kê các file trong thư mục làm việc hiện hành được theo dõi bởi git, tôi thấy rằng sau đây là nhanh hơn nhiều lần so với sử dụng git ls-tree...:

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

Nó sẽ mất một ít phiền xung quanh với sed nếu bạn cũng muốn bao gồm danh bạ, một cái gì đó dọc theo dòng:

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

giả sử bạn không có bất kỳ ký tự '/' nào trong tên tệp của mình. Cũng như ...

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

để cũng liệt kê "vô hình" file (chưa-theo dõi).

+0

Điều này thật tuyệt ... Tôi tự hỏi tại sao tôi không thể thêm nó như là một '[bí danh]' ?? 'ls-track ="! f() {ls | grep -f <(git ls-files | sed 's /\/.*// g' sắp xếp | uniq);}; f "' -> 'gây tử vong: tập tin cấu hình xấu' –

4

git ls-tree <tree-ish> là tốt và tất cả, nhưng tôi không thể tìm ra cách để xác định chỉ số như <tree-ish>. (Mặc dù tôi chắc chắn có ràng buộc để được một số bài-mũ tham khảo để làm việc đó.)

Nhưng dù sao, ls-files ngầm hoạt động trên các chỉ số vì vậy tôi cũng có thể sử dụng:

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

chương trình này chỉ các tệp và thư mục trong thư mục hiện tại.

Thay đổi đối số 's -f để kiểm soát độ sâu. Ví dụ, -f-2 (đó là dash hai) cho thấy các file và thư mục lên đến hai cấp độ sâu:

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

NẾU bạn xác định đối số <path>-ls-files, hãy chắc chắn để tăng -f để thích ứng với thư mục hàng đầu:

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

Bạn có thể lấy một cây cho chỉ mục bằng ['git write-tree'] (https://git-scm.com/docs/git-write-tree). – jthill

0

Tôi ngạc nhiên về điều này thật khó khăn ... nhưng đừng bắt tôi bắt đầu hiểu về git.

Một biến thể trên câu trả lời của jthill có vẻ là bí danh (hey, tôi là nhà ngôn ngữ học, tôi có giấy phép để tạo từ mới).Các biến thể là

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

này sử dụng 'ls' để định dạng đầu ra, vì vậy bạn sẽ có được mã hóa màu sắc (nếu bạn sử dụng), vv Nó cũng hoạt động như một bí danh:

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

FWIW, bạn cũng có thể bí danh lệnh đệ quy, do đó bạn đã sử dụng định dạng 'ls' (ví dụ: nếu tên tệp + đường dẫn của bạn không quá dài, bạn sẽ nhận được hai cột đầu ra, mã hóa màu của tệp thực thi, v.v.)

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