2009-12-31 19 views

Trả lời

3

Bạn sẽ cần phải chắc chắn rằng cả hai thuộc tính sau được đáp ứng:

  1. Đó không có sự khác biệt giữa đầu và bộ nhớ cache index

    git diff-index --cached HEAD

  2. Đó có không có sự khác biệt giữa chỉ mục và cây đang hoạt động:

    git diff-files

thông số sẽ đặt mã thoát theo liệu có sự khác biệt hay không (bắt đầu một thời gian sau git 1.4). Nếu bạn cần làm cho nó hoạt động trên git 1.4, bạn cần chạy các lệnh mà không cần --quiet và kiểm tra xem chúng có tạo ra bất kỳ đầu ra nào không.

Lưu ý:git diff là lệnh sứ và do đó không được sử dụng trong tập lệnh. Thay vào đó, hãy sử dụng các lệnh đường ống dẫn nước trên.

Ví dụ mã vỏ, lấy từ git_version.sh script tôi:

git_dirty=yes 
# git-1.4 does not understand "git-diff-files --quiet" 
# git-1.4 does not understand "git-diff-index --cached --quiet HEAD" 
if [ "x$($GIT diff-files)" = "x" ] && [ "x$($GIT diff-index --cached HEAD)" = "x" ]; then 
    git_dirty=no 
fi 

Nếu bạn có thể yêu cầu một phiên bản git> = 1.5, if git diff-files --quiet && git diff-index --quiet --cached HEAD; then có thể thay thế ở trên so sánh.

Lưu ý: Giải pháp này (giống hệt như Antony của tương tác git diff HEAD --quiet) chỉ phát hiện ra những thay đổi địa phương so với HEAD. Tuy nhiên, các cam kết cục bộ có thể lập luận cũng được coi là thay đổi cục bộ và tự nhiên sẽ không hiển thị ở bất kỳ điểm nào khác với HEAD. Bạn sẽ cần phải kiểm tra giá trị SHA1 git describe sử dụng để phát hiện xem HEAD có từ một tập hợp các cam kết mà bạn cho là không phải là thay đổi cục bộ hay không.

+0

Xem thêm nhận xét của tôi tại http://stackoverflow.com/questions/1985301/how-to-make-git-describe-mention-the-presence-or-absence-of-local-changes/1985431#1985431 –

0

git status thoát với trạng thái khác 0 nếu không có thay đổi cục bộ.

Nhưng tôi không hiểu ý bạn là "kết hợp với git mô tả".

+0

v1.1-5-g1234567 có nghĩa là không có thay đổi địa phương và v1.1-5-g1234567 (+) có nghĩa là với thay đổi cục bộ. trạng thái git trả về 1 ở đây khi các thay đổi cục bộ không được thay đổi là hiện tại –

1

git diff --quiet trả về với trạng thái thoát 1 nếu có thay đổi và 0 nếu không có.

Hãy nhớ rằng nó sẽ hiển thị khác biệt giữa các thay đổi theo giai đoạn và thư mục hoạt động. Nếu bạn quan tâm đến các thay đổi giữa HEAD và thư mục làm việc, bạn nên sử dụng git diff HEAD --quiet.

--quiet ngụ ý --exit-code.

+0

Tôi thấy hai vấn đề với giải pháp này: a) 'git diff' là sứ, và git ngược dòng đề nghị sử dụng sứ trong kịch bản. b) 'git diff' sẽ bỏ qua bất kỳ thay đổi không được cam kết nào trong bộ đệm chỉ mục. Xem câu trả lời của tôi tại http://stackoverflow.com/questions/1985301/how-to-make-git-describe-mention-the-presence-or-absence-of-local-changes/1989142#1989142 để biết cách giải quyết những vấn đề này. – ndim

+0

Câu hỏi đặt ra là tìm các thay đổi _local_. 'git diff HEAD --quiet' tìm các thay đổi _local_ chính xác là kết quả của hai lệnh hệ thống ống nước bạn đã khuyên. Sự khác biệt giữa sứ/hệ thống ống nước không quá quan trọng ở đây. –

+0

Các nhà phát triển git nói rằng để sử dụng lệnh đường ống dẫn nước cho các tập lệnh, vì vậy tôi căn cứ các tập lệnh của tôi trên các tập lệnh đó. Đối với các thay đổi * cục bộ *, 'git diff HEAD --quiet' chắc chắn có chức năng tương đương với hai lệnh của tôi, nhưng tôi vẫn thích API git upstream đề xuất cho các kịch bản lệnh. – ndim

7

Vì git 1.6.6, git-describe đã chấp nhận tùy chọn --dirty.Nếu bạn có thay đổi không bị giam trong cây làm việc của bạn sau đó bạn sẽ nhận được kết quả như thế này:

$ git describe --dirty 
1.0.2-2-g215081f-dirty 
Các vấn đề liên quan