Phân tích cú pháp đầu ra git status
là 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 status
không thay đổi khi có những thay đổi không được cam kết. Tuy nhiên, nó cung cấp --porcelain
tù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 --porcelain
là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=no
tù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 status
lỗ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 status
không cung cấp mã thoát có ý nghĩa khi thư mục làm việc không sạch sẽ, git diff
cung cấp --exit-code
tù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 1
khi có sự khác biệt và 0
khi 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 diff
có 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 --porcelain
có lẽ là đặt cược tốt nhất.