2011-11-14 30 views
48

Tôi đang cố gắng viết một kịch bản vải thực hiện git commit; tuy nhiên, nếu không có gì để cam kết, git thoát với trạng thái là 1. Kịch bản triển khai thực hiện điều đó là không thành công và thoát. Tôi muốn phát hiện thực tế thất bại để cam kết, vì vậy tôi không thể chỉ cung cấp cho một tấm chăn vải bỏ qua cho git commit thất bại. Làm thế nào tôi có thể cho phép bỏ qua các lỗi thất bại cam kết để triển khai có thể tiếp tục, nhưng vẫn gặp lỗi gây ra khi một cam kết thực sự thất bại?Làm thế nào để git cam kết không có gì mà không có lỗi?

def commit(): 
    local("git add -p && git commit") 

Trả lời

69

Bắt điều kiện này trước bằng cách kiểm tra mã thoát của git diff?

Ví dụ (trong vỏ):

git add -A 
git diff-index --quiet HEAD || git commit -m 'bla' 

EDIT: Cố định git diff lệnh theo bình luận của Holger.

+47

Lưu ý rằng 'git diff' là một lệnh" sứ "không nên được sử dụng để tạo tập lệnh. Điều bạn có thể muốn nhất là 'git diff-index --quiet HEAD || git commit -m 'bla''. Xem thêm [câu trả lời này] (http://stackoverflow.com/a/2659808/659002). – Holger

+0

Để giải thích thêm, vấn đề với 'git diff --quiet --exit-code --cached' là nó sẽ đánh giá thành' 1' (false) chỉ cho các tệp đã sửa đổi chưa được dàn dựng để commit (các tệp chưa được thêm vào)). Bình luận được bình chọn lên là giải pháp tốt nhất để giải thích các tập tin và xóa mới. –

+0

Nhận xét về 'git diff-index --quiet HEAD || git commit -m 'bla'' phải là câu trả lời trong câu hỏi này. –

41

Từ trang git commit người đàn ông:

--allow-empty 
    Usually recording a commit that has the exact same tree as its 
    sole parent commit is a mistake, and the command prevents you 
    from making such a commit. This option bypassesthe safety, and 
    is primarily for use by foreign SCM interface scripts. 
+26

Điều này thực sự sẽ tạo ra một cam kết. – ThiefMaster

+5

@ThiefMaster: Đúng vậy. Tôi không thể nói từ OP dù đây có phải là vấn đề hay không. Tôi đoán nếu bạn đang sử dụng cam kết tự động, bạn không quan tâm về lịch sử của bạn được sạch sẽ anyway. –

+1

Tôi muốn nó không cam kết nếu nó có thể tránh được. Có cách nào làm được việc này không? – kojiro

6
with settings(warn_only=True): 
    run('git commit ...') 

Điều này làm cho vải để bỏ qua sự thất bại. Có lợi thế là không tạo ra các cam kết trống.

Bạn có thể bọc nó trong một lớp bổ sung with hide('warnings'): để triệt tiêu đầu ra, nếu không bạn sẽ nhận được một lưu ý trong đầu ra vải rằng cam kết không thành công (nhưng fabfile tiếp tục thực thi).

+0

OP đã viết" Tôi muốn phát hiện * thực tế * thất bại-to-cam kết "; mã này sẽ ẩn * tất cả * lỗi thành công. – bfontaine

-3

thử/bắt em bé!

from fabric.api import local 
from fabric.colors import green 


def commit(message='updates'): 
    try: 
     local('git add .') 
     local('git commit -m "' + message + '"') 
     local('git push') 
     print(green('Committed and pushed to git.', bold=False)) 
    except: 
     print(green('Done committing, likely nothing new to commit.', bold=False)) 
+6

Để giải thích lý do bạn bị giảm giá: Có thể có các lỗi khác mà bạn muốn nắm bắt. Bạn không muốn chỉ giả định rằng trong trường hợp có lỗi, nó có thể là không có gì phải được cam kết.- Ngoài ra, nhưng đó không liên quan: Không bao giờ sử dụng một generic 'except:', sử dụng 'except Exception' hoặc để thay thế. – Albert

Các vấn đề liên quan