2015-07-20 11 views
5

Tôi cần phải thực hiện một loạt các tệp đã thay đổi và scp chúng thành các hộp khác nhau để thử nghiệm. Tôi đang gặp khó khăn trong việc tìm cách tạo git status cho tôi một danh sách như ls -1 để tôi có thể viết các hành động với nỗ lực tối thiểu."trạng thái git" ở định dạng ngắn hoặc ngắn như "ls -1"?

Tôi có tập lệnh hiện có thực hiện những gì tôi cần bằng cách sử dụng ls -1. Tôi không phải là một người có năng khiếu, vì vậy tôi không muốn sửa đổi kịch bản. Thay vào đó, tôi muốn công cụ sửa đổi đầu ra của nó.

Rõ ràng, git status -1 không hoạt động. Định dạng trong How can I get 'git status' to always use short format không tương thích với tập lệnh của tôi. Và git status --column đã tạo ra kết quả tương tự như dưới đây.

Làm cách nào để có các tệp được sửa đổi danh sách git status, một tệp trên một dòng, chỉ với tệp được sửa đổi trên dòng?


$ git status 
On branch master 
Your branch and 'origin/master' have diverged, 
and have 1 and 2 different commits each, respectively. 
    (use "git pull" to merge the remote branch into yours) 

Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    modified: cryptest.vcproj 
    modified: dlltest.vcproj 

Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: adler32.cpp 
    modified: algebra.cpp 
    modified: algparam.cpp 
    modified: asn.cpp 
    modified: asn.h 
    modified: authenc.cpp 
    modified: authenc.h 
    modified: basecode.cpp 
    modified: cast.cpp 
    modified: ccm.cpp 
    modified: cmac.cpp 
    modified: config.h 
    modified: cryptdll.vcproj 
    modified: cryptlib.cpp 
    modified: cryptlib.h 
    modified: cryptlib.vcproj 
    modified: datatest.cpp 
    modified: dlltest.cpp 
    modified: eax.cpp 
    modified: ec2n.cpp 
    modified: eccrypto.cpp 
    modified: ecp.cpp 
    modified: emsa2.cpp 
    modified: eprecomp.cpp 
    modified: esign.cpp 
    modified: files.cpp 
    modified: filters.cpp 
    modified: filters.h 
    modified: fips140.cpp 
    modified: fipsalgt.cpp 
    modified: fltrimpl.h 
    modified: gf2_32.cpp 
    modified: gf2n.cpp 
    modified: gf2n.h 
    modified: gfpcrypt.cpp 
    modified: gfpcrypt.h 
    modified: hkdf.h 
    modified: hmac.cpp 
    modified: hrtimer.cpp 
    modified: ida.cpp 
    modified: idea.cpp 
    modified: integer.cpp 
    modified: iterhash.cpp 
    modified: luc.h 
    modified: misc.cpp 
    modified: misc.h 
    modified: modes.cpp 
    modified: modes.h 
    modified: nbtheory.cpp 
    modified: network.cpp 
    modified: oaep.cpp 
    modified: panama.cpp 
    modified: pkcspad.cpp 
    modified: polynomi.cpp 
    modified: pssr.cpp 
    modified: pubkey.h 
    modified: pwdbased.h 
    modified: queue.cpp 
    modified: rijndael.cpp 
    modified: rsa.cpp 
    modified: rw.cpp 
    modified: salsa.cpp 
    modified: seal.cpp 
    modified: secblock.h 
    modified: simple.h 
    modified: smartptr.h 
    modified: socketft.cpp 
    modified: socketft.h 
    modified: sosemanuk.cpp 
    modified: strciphr.cpp 
    modified: strciphr.h 
    modified: test.cpp 
    modified: validat1.cpp 
    modified: validat2.cpp 
    modified: vmac.cpp 
    modified: wait.cpp 
    modified: winpipes.cpp 
    modified: winpipes.h 
    modified: words.h 
    modified: xtr.cpp 
    modified: xtr.h 
    modified: zdeflate.cpp 
    modified: zinflate.cpp 

Trả lời

7

git status --porcelain

Sản lượng này sẽ ở dạng ngắn nhưng sẽ phù hợp trên tất cả các phiên bản của Git.

git-status documentation

Dưới đây là một đoạn trích từ các tài liệu tham khảo:

--porcelain
Đưa đầu ra trong một định dạng dễ phân tích cú pháp cho các kịch bản. Điều này tương tự như đầu ra ngắn, nhưng sẽ vẫn ổn định trên các phiên bản Git và bất kể cấu hình người dùng.

+0

Điều này vẫn không tái tạo đầu ra của 'ls -1'. Chăm sóc để mở rộng câu trả lời của bạn một chút wee? – ghoti

+0

Cảm ơn. Của nó gần, nhưng có thêm nhân vật trên dòng. Tôi muốn một tệp được liệt kê trên một dòng. – jww

+0

Thật không may tôi không nghĩ rằng bạn có thể đầu ra đó cắt giảm nữa. 'git-status' không chỉ liệt kê các tệp. Nó cung cấp nhiều thông tin hơn thế, vì vậy bên ngoài rút ngắn đầu ra với tùy chọn đó, đặt cược tốt nhất của bạn (và chỉ có tùy chọn, tôi nghĩ) là chỉ có logic phân tích cú pháp tùy chỉnh. –

2

Như Thomas đã đề xuất, tùy chọn --porcelain là điều bạn muốn. Nhưng tất nhiên, để có được JUST tên tập tin của các tập tin sửa đổi, bạn cần phải phân tích đầu ra đó là tốt. Ví dụ, đường ống đầu ra thông qua một kịch bản sed đơn giản như thế này có thể làm việc:

git status --porcelain | sed -ne '/^M */s///p' 

Kịch bản này tìm kiếm một M và khoảng trắng ở đầu dòng. Nếu chúng được tìm thấy, chúng được loại bỏ và dòng được in. Nếu không tìm thấy chúng (tức là đầu ra không phải là một tệp khác có kích thước là M), thì không có đầu ra nào được hiển thị.

Đầu ra của dòng lệnh ở trên chỉ tương đương với những gì bạn nhận được từ ls -1 - đó là danh sách các tệp không có thông tin khác. Lưu ý rằng --porcelain chấm dứt tên tệp bằng NULL, vì vậy nếu đầu ra không hoạt động như bạn mong đợi, bạn có thể cần phải xử lý tệp đó trong tập lệnh của mình hoặc trong một đường ống khác. (Đọc về xargs(1)).

+0

Câu trả lời của bạn không bao gồm tất cả các trường hợp. Chỉ các tệp được dàn dựng đầy đủ mới có đầu ra từ 'git status --porcelain' được xử lý bởi' sed' của bạn. Nếu một tập tin nào đó đã được sửa đổi, nhưng không được kết nối, đầu ra sẽ trông giống như "M an_unstaged_file' (với khoảng trống ở đầu). Thậm chí tốt hơn, nếu tập tin có cả phần được tổ chức và không có phần, đầu ra sẽ là' MM an_unstaged_and_staged_file'. – werkritter

2

Nếu bạn có những thay đổi unstaged, bạn có thể liệt kê tất cả các file chạm trong một danh sách một cột tương tự như ls -1 với lệnh này:

file

git ls-files --modified --others --exclude-standard --directory

Tùy chọn --modified cho thấy biến đổi và --others lựa chọn chương trình các tệp không được theo dõi khác như tệp mới; --exclude-standard bỏ qua các tệp bị loại trừ và --directory chỉ liệt kê các tên thư mục chứ không phải các tệp bên trong chúng. Tham khảo documentation để biết thêm thông tin.

Đây là lệnh tôi sử dụng để nhanh chóng sao chép tất cả các file sửa đổi và mới vào thư mục tạm thời của tôi trong khi vẫn giữ các đường dẫn thư mục đầy đủ (một sự thay thế bẩn để git stash):

git ls-files --modified --others --exclude-standard --directory | xargs -I {} cp --parents {} ~/temp 

Nếu bạn đã thêm các tệp để git được cam kết (ví dụ: git add -A .), sau đó bạn có thể sử dụng lệnh trong câu trả lời được chấp nhận và trích xuất cột thứ hai để nhận danh sách tệp đồng bằng:

git status --porcelain | awk '{ print $2 }'

Nếu bạn muốn lọc các hàng theo tình trạng git, sau đó bạn có thể làm một cái gì đó như thế này:

git status --porcelain | grep ^[AM] | awk '{ print $2 }'

này cung cấp cho bạn một danh sách chứa chỉ sửa đổi (M) và mới được bổ sung (A) file .


Cập nhật:

  • đề nghị gia tăng @ jotik của.
+1

'git ls-files --modified --others --exclude-standard --directory' có thể cung cấp cho đầu ra tốt hơn, bằng cách lấy các tệp loại trừ git vào tài khoản và không đệ quy vào các thư mục không nằm dưới sự kiểm soát phiên bản. – jotik

1

Đối với danh sách tệp đã sửa đổi, các lệnh sau đây có thể trợ giúp.

git diff --name-only

hoặc

git diff --name-status

int đầu ra của --name-trạng thái, trạng thái (A, M, D) và tập tin tên đường dẫn được phân cách bằng tab, bạn có thể phân tích nó bởi lệnh cut.

Nếu bạn có thể nhận danh sách tệp trên dàn trang quá, tùy chọn `--cache 'có thể được sử dụng.

Các vấn đề liên quan