Làm thế nào để git không cam kết mà không có lỗi?


91

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

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

Câu trả lời:


154

Nắm bắt trước tình trạng này bằng cách kiểm tra mã thoát của git diff?

Ví dụ (trong shell):

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

EDIT: Đã sửa git difflệnh theo nhận xét của Holger.


64
Lưu ý rằng đó git difflà một lệnh "sứ" không nên được sử dụng cho kịch bản. Những gì bạn có thể muốn là git diff-index --quiet HEAD || git commit -m 'bla'. Xem thêm câu trả lời này .
Holger

1
Để giải thích thêm về mọi thứ, vấn đề git diff --quiet --exit-code --cachedlà nó sẽ chỉ đánh giá thành 1(sai) đối với các tệp đã sửa đổi chưa được sắp xếp cho cam kết (tệp chưa được mã hóa). Nhận xét được bình chọn là giải pháp tốt nhất để giải quyết các tệp mới và xóa.
Jorge Bucaran

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

1
Vì Tobi không quan tâm đến việc sửa câu trả lời của mình theo nhận xét của Holger, tôi đã tự mình sửa câu trả lời của anh ấy.
vog

Lưu ý rằng git diff-index --quiet HEAD không kiểm tra xem kho lưu trữ cục bộ có được cập nhật nguồn gốc hay không.
bortzmeyer

62

Từ git committrang 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.

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

6
@ThiefMaster: Đúng. Tôi không thể nói từ OP liệu đâ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 đến việc lịch sử của mình có sạch sẽ hay không.
Sven Marnach,

1
Tôi không muốn nó 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

3
Đây không phải là câu trả lời cho câu hỏi
manojlds

7
@manojlds: "Tất nhiên OP không muốn tạo một cam kết trống." Hôm nay tôi để quả cầu pha lê ở nhà nên tôi không biết. bỏ lỡ -p, tuy nhiên, nhưng vẫn
Sven Marnach

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

Điều này làm cho vải bỏ qua lỗi hỏng. 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'):để chặn hoàn toàn đầu ra, nếu không, bạn sẽ nhận được thông báo trong đầu ra vải rằng cam kết không thành công (nhưng fabfile vẫn tiếp tục thực thi).


3
OP đã viết "Tôi muốn phát hiện các lỗi thực tế để cam kết"; mã này sẽ ẩn tất cả các lỗi để cam kết.
bfontaine

-2

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))

10
Để giải thích lý do tại sao bạn bị phản đối: Có thể có những lỗi khác mà bạn muốn phát hiện. Bạn không muốn chỉ cho rằng trong trường hợp có lỗi, có thể không cần phải cam kết gì cả. - Ngoài ra, nhưng điều đó không liên quan: Không bao giờ sử dụng chung chung except:, sử dụng except Exceptionhoặc tương tự thay thế.
Albert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.