Phân tích cú pháp đầu ra git statuslà một ý tưởng tồi vì đầu ra được dự định là con người có thể đọc được, không phải máy có thể đọc được. Không có gì đảm bảo rằng đầu ra sẽ giữ nguyên trong các phiên bản Git trong tương lai hoặc trong các môi trường được cấu hình khác nhau.
Nhận xét của UVV đang đi đúng hướng, nhưng thật không may, mã trả về git statuskhông thay đổi khi có những thay đổi không được cam kết. Tuy nhiên, nó cung cấp --porcelaintùy chọn, khiến đầu ra của git status --porcelainđược định dạng theo định dạng dễ phân tích cú pháp cho các tập lệnh và sẽ ổn định trên các phiên bản Git và bất kể cấu hình người dùng.
Chúng tôi có thể sử dụng đầu ra trống git status --porcelainlàm chỉ báo rằng không có thay đổi nào được cam kết:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Nếu chúng ta không quan tâm đến các tệp không bị theo dõi trong thư mục làm việc, chúng ta có thể sử dụng --untracked-files=notùy chọn để bỏ qua các tệp đó:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Để làm cho điều này mạnh mẽ hơn đối với các điều kiện thực sự gây ra git statuslỗi mà không có đầu ra stdout, chúng ta có thể tinh chỉnh kiểm tra thành:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Cũng đáng lưu ý rằng, mặc dù git statuskhông cung cấp mã thoát có ý nghĩa khi thư mục làm việc không sạch sẽ, git diffcung cấp --exit-codetùy chọn, làm cho nó hoạt động tương tự như tiện ích diff , nghĩa là thoát khỏi trạng thái 1khi có sự khác biệt và 0khi không tìm thấy.
Sử dụng điều này, chúng tôi có thể kiểm tra các thay đổi chưa được thực hiện với:
git diff --exit-code
và dàn dựng, nhưng không cam kết thay đổi với:
git diff --cached --exit-code
Mặc dù git diffcó thể báo cáo về các tệp không bị theo dõi trong các mô hình con thông qua các đối số thích hợp --ignore-submodules, nhưng thật không may là dường như không có cách nào để báo cáo về các tệp không bị theo dõi trong thư mục làm việc thực tế. Nếu các tệp không bị theo dõi trong thư mục làm việc có liên quan, git status --porcelaincó lẽ là đặt cược tốt nhất.