Chìa khóa để tạo ra kịch bản tin cậy của Gv trên Git là sử dụng các lệnh 'ống nước'.
Các nhà phát triển cẩn thận khi thay đổi các lệnh hệ thống ống nước để đảm bảo rằng họ cung cấp các giao diện rất ổn định (nghĩa là sự kết hợp nhất định của trạng thái kho lưu trữ, stdin, tùy chọn dòng lệnh, đối số, v.v. sẽ tạo ra cùng một đầu ra trong tất cả các phiên bản của Git trong đó lệnh / tùy chọn tồn tại). Các biến thể đầu ra mới trong các lệnh hệ thống ống nước có thể được giới thiệu thông qua các tùy chọn mới, nhưng điều đó không thể gây ra bất kỳ vấn đề nào cho các chương trình đã được viết so với các phiên bản cũ hơn (chúng sẽ không sử dụng các tùy chọn mới, vì chúng không tồn tại (hoặc ít nhất là không được sử dụng) tại thời điểm kịch bản được viết).
Thật không may, các lệnh Git 'hàng ngày' là các lệnh 'sứ', vì vậy hầu hết người dùng Git có thể không quen thuộc với các lệnh hệ thống ống nước. Sự khác biệt giữa lệnh sứ và hệ thống ống nước được thực hiện trong trang git chính (xem phần phụ có tiêu đề Lệnh cấp cao (sứ) và lệnh cấp thấp (hệ thống ống nước) .
Để tìm hiểu về các thay đổi không được cam kết, bạn có thể sẽ cần git diff-index
(so sánh chỉ mục (và có thể các bit của cây làm việc được theo dõi) với một số cây khác (ví dụ HEAD
)), có thể git diff-files
(so sánh cây làm việc với chỉ mục) và có thể git ls-files
(liệt kê các tệp; , tập tin chưa được đăng ký).
(Lưu ý rằng trong các lệnh bên dưới, HEAD --
được sử dụng thay HEAD
vì vì nếu không lệnh sẽ thất bại nếu có tệp có tên HEAD
.)
Để kiểm tra xem kho lưu trữ có thay đổi theo giai đoạn (chưa được cam kết hay không), hãy sử dụng:
git diff-index --quiet --cached HEAD --
- Nếu nó thoát ra
0
thì không có sự khác biệt ( 1
có nghĩa là có sự khác biệt).
Để kiểm tra xem một cây làm việc có những thay đổi có thể được dàn dựng hay không:
git diff-files --quiet
- Mã thoát giống như cho
git diff-index
( 0
== không có sự khác biệt; 1
== sự khác biệt).
Để kiểm tra xem sự kết hợp của chỉ mục và các tệp được theo dõi trong cây làm việc có thay đổi liên quan đến HEAD
:
git diff-index --quiet HEAD --
- Đây giống như một sự kết hợp của hai phần trước. Một điểm khác biệt chính là nó vẫn sẽ báo cáo không có sự khác biệt nào nếu bạn có một sự thay đổi theo giai đoạn mà bạn có sự hoàn tác của Google trong cây làm việc (quay lại nội dung trong đó
HEAD
). Trong tình huống tương tự, hai lệnh riêng biệt này sẽ trả về các báo cáo về sự khác biệt của hiện tại.
Bạn cũng đề cập đến các tập tin chưa được theo dõi. Bạn có thể có nghĩa là không bị đánh cắp và không được xếp hạng, hoặc bạn có thể có nghĩa là chỉ đơn giản là không bị đánh cắp (bao gồm các tập tin bị bỏ qua). Dù bằng cách nào, git ls-files
là công cụ cho công việc:
Đối với những người chưa được theo dõi trên mạng (sẽ bao gồm các tập tin bị bỏ qua, nếu có):
git ls-files --others
Đối với những người khác không bị theo dõi và không được xếp hạng:
git ls-files --exclude-standard --others
Suy nghĩ đầu tiên của tôi là chỉ kiểm tra xem các lệnh này có đầu ra không:
test -z "$(git ls-files --others)"
- Nếu nó thoát với
0
thì không có tập tin nào được theo dõi. Nếu nó thoát với 1
thì có các tệp không bị theo dõi.
Có một khả năng nhỏ là điều này sẽ dịch các lối thoát bất thường từ git ls-files
sang không có tệp nào không bị theo dõi các báo cáo của Google (cả hai đều dẫn đến các lối thoát khác không của lệnh trên). Một phiên bản mạnh mẽ hơn một chút có thể trông như thế này:
u="$(git ls-files --others)" && test -z "$u"
- Ý tưởng này giống như lệnh trước đó, nhưng nó cho phép các lỗi không mong muốn từ
git ls-files
lan truyền ra ngoài. Trong trường hợp này, một lối thoát khác không có thể có nghĩa là có những tập tin không bị theo dõi, hoặc có thể có nghĩa là đã xảy ra lỗi. Thay vào đó, nếu bạn muốn các kết quả lỗi Lỗi khác kết hợp với các tập tin không bị bẻ khóa, kết quả là sử dụng test -n "$u"
(trong đó lối ra của 0
phương tiện là một số tập tin không bị bẻ khóa, và không có nghĩa là lỗi hoặc không có các tập tin không bị bẻ khóa).
Một ý tưởng khác là sử dụng --error-unmatch
để gây ra một lối thoát khác không khi không có tệp không bị theo dõi. Điều này cũng có nguy cơ khiến conflating không có các tập tin không bị bẻ khóa. (Thoát 1
) với lỗi xảy ra lỗi (thoát không khác, nhưng có lẽ 128
). Nhưng việc kiểm tra mã thoát 0
so 1
với khác không có lẽ khá mạnh mẽ:
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
Bất kỳ git ls-files
ví dụ nào ở trên có thể được thực hiện --exclude-standard
nếu bạn chỉ muốn xem xét các tệp không bị theo dõi và không được đánh dấu.