2013-04-10 19 views
10

Logic đằng sau yêu cầu sử dụng mẫu loại trừ với lệnh git ls-files --ignored là gì?Tại sao git ls-files --ignore yêu cầu loại trừ các mẫu?

Từ git help ls-files:

-i, --ignored

Hiển thị các tập chỉ phớt lờ trong đầu ra. Khi hiển thị tệp trong chỉ mục, chỉ in những tệp được so khớp bằng mẫu loại trừ. Khi hiển thị các tệp "khác", chỉ hiển thị những tệp được so khớp bằng mẫu loại trừ.

+0

Bạn có nghĩa là cần chỉ định '--exclude-standard' (hoặc tương tự)? –

Trả lời

13

Trước hết hãy để tôi đảm bảo bạn không nhầm lẫn --ignored với --other.

--other là tùy chọn bạn đưa ra để liệt kê các tệp không được theo dõi. Từ hướng dẫn của git-ls-files (tôi nhấn mạnh):

-o, --others

Hiện khác (ví dụ: untracked) file trong đầu ra

Điều đó nói rằng, chúng ta hãy xem những gì --ignored làm. Bất kể những gì bạn đang liệt kê, cho dù đó là các tập tin theo dõi, các tập tin không được sửa chữa, tập tin đã sửa đổi, vv, bạn có thể loại trừ một số tập tin từ đầu ra. Hãy suy nghĩ về nó như là một miễn phí grep -v tự động thực hiện trên đầu ra. Ví dụ:

git ls-files --other --exclude=*.o 

sẽ liệt kê tất cả các tệp không được theo dõi không khớp với *.o. Mẫu loại trừ không có gì để làm với .gitignore. Thật vậy, .gitignore xác định những gì --other sẽ xuất trong khi --exclude lọc đầu ra sau khi danh sách được thực hiện (hoặc ít nhất đó là hành vi được quan sát) .

Hiện tại --ignored chỉ cần hoàn nguyên đầu ra. Vì vậy, những gì đã bị loại trừ bởi exclude= sẽ được in thay thế và những gì không bị loại trừ sẽ bị bỏ qua. Vì vậy, ví dụ:

git ls-files --other --exclude=*.o --ignored 

sẽ in tất cả các file untracked rằng làm trận đấu *.o.

Không chính xác như vậy, --exclude chỉ lọc các tệp không được theo dõi, vì vậy nếu bạn liệt kê các tệp được theo dõi, --exclude sẽ không loại trừ bất kỳ thứ gì. Tuy nhiên, với --ignored nó sẽ liệt kê các tệp cần được loại trừ. Đó là một chút lạ.

Kết luận:--ignored về cơ bản sẽ hoàn nguyên mẫu loại trừ được đưa ra trong dòng lệnh. Theo mặc định, mẫu loại trừ trống (bạn thấy mọi thứ), do đó, --ignored mà không có bất kỳ mẫu loại trừ nào dẫn đến mọi thứ bị bỏ qua. Điều này không bao giờ hữu ích và đó là lý do tại sao một mẫu loại trừ là bắt buộc đối với --ignored để hoạt động.


--exclude-standard đã được đề cập, tôi cũng muốn mở rộng điều đó. --exclude-standard sẽ thêm các mẫu bị bỏ qua (chẳng hạn như được viết bằng .gitignore) làm mẫu loại trừ trong danh sách. Vì vậy, hãy suy nghĩ về lệnh sau:

git ls-files --ignored --exclude-standard 

Lúc đầu, lệnh này liệt kê tất cả các tệp được theo dõi. Sau đó, với lệnh --ignored, lệnh này sẽ chỉ in các tệp đó khớp với mẫu loại trừ. Với --exclude-standard, các tệp hiệu quả phù hợp với các mẫu trong .gitignore sẽ được in. NHƯNG đó là những tập tin mà bạn giữ không được theo dõi. Vì vậy, hiệu quả, bạn sẽ thấy không có gì. Trường hợp duy nhất bạn sẽ xem điều gì đó là nếu bạn đang theo dõi các tệp mà bạn cũng đã đề cập bị bỏ qua trong .gitignore.

Nói cách khác, nếu lệnh đó xuất ra bất kỳ thứ gì, điều đó có nghĩa là bạn đã yêu cầu git bỏ qua một số tệp nhất định, nhưng bạn đã vi phạm các quy tắc của riêng mình và thêm chúng vào kho lưu trữ.


lệnh thú vị khác có thể là:

git ls-files --other --exclude-standard 

Hiển thị tất cả các file untracked rằng bạn đã không chỉ định trong .gitignore. Bạn cũng sẽ thấy các tệp này trong git status.

git ls-files --other --ignored --exclude-standard 

Hiển thị tất cả các tệp không được theo dõi mà bạn đã bỏ qua thành công với .gitignore. Nói cách khác, (giả sử truy vấn trước đó trống, nghĩa là không có các tập tin chưa được hủy liên kết) điều này cho thấy tất cả các tệp nằm trong thư mục hiện tại không thuộc về kho lưu trữ. Điều này rất hữu ích để kiểm tra các tệp không nên bị bỏ qua và phải được đặt trong kho lưu trữ.

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