CẬP NHẬT : OP Daniel Stutzbach chỉ ra trong các ý kiến rằng lệnh đơn giản này git diff-index
đã làm việc cho anh ta:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagon đề cập trong các ý kiến rằng, nếu có các tệp đã bị chạm, nhưng có nội dung giống như trong chỉ mục, bạn sẽ cần phải chạy git update-index --refresh
trước git diff-index
, nếu không diff-index
sẽ báo cáo không chính xác rằng cây bị bẩn)
Sau đó, bạn có thể xem " Cách kiểm tra xem một lệnh có thành công không? " Nếu bạn đang sử dụng nó trong tập lệnh bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Lưu ý: như nhận xét của Anthony Sottile
git diff-index HEAD ...
sẽ thất bại trên một nhánh không có cam kết (chẳng hạn như kho lưu trữ mới được khởi tạo).
Một cách giải quyết tôi đã tìm thấy làgit diff-index $(git write-tree) ...
Và haridsv
chỉ ra trong các ý kiến rằng git diff-files
trên một tệp mới không phát hiện ra nó là một khác biệt.
Cách tiếp cận an toàn hơn dường như là chạy git add
trên spec tệp trước và sau đó sử dụng git diff-index
để xem có gì được thêm vào chỉ mục trước khi chạy không git commit
.
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
Và 6502 báo cáo trong các ý kiến:
Một vấn đề tôi gặp phải là nó git diff-index
sẽ cho biết rằng có những khác biệt khi thực sự không có gì ngoại trừ dấu thời gian của các tệp.
Chạy git diff
một lần giải quyết vấn đề (đủ ngạc nhiên, git diff
thực sự thay đổi nội dung của hộp cát, có nghĩa là ở đây .git/index
)
Các vấn đề dấu thời gian này cũng có thể xảy ra nếu git đang chạy trong docker .
Câu trả lời gốc:
"Lập trình" có nghĩa là không bao giờ dựa vào các lệnh sứ .
Luôn luôn dựa vào các lệnh hệ thống ống nước .
Xem thêm " Kiểm tra chỉ mục bẩn hoặc các tệp không bị theo dõi bằng Git " để biết các lựa chọn thay thế (như git status --porcelain
)
Bạn có thể lấy cảm hứng từ " require_clean_work_tree
chức năng " mới được viết khi chúng ta nói ;) (đầu tháng 10 năm 2010)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}