git은 오류없이 아무것도 커밋하지 않는 방법?


91

나는하는 패브릭 스크립트를 작성하려고 해요 git commit; 그러나 커밋 할 내용이 없으면 git은 상태가 1. 배포 스크립트는이를 실패한 것으로 간주하고 종료합니다. 실제 커밋 실패 를 감지하고 싶기 때문에 패브릭에 git commit실패를 무시할 수는 없습니다 . 배포를 계속할 수 있지만 실제 커밋이 실패 할 때 발생하는 오류를 포착하도록 빈 커밋 실패를 무시하려면 어떻게해야합니까?

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

답변:


154

git diff의 종료 코드를 확인하여이 조건을 미리 포착 하시겠습니까?

예 (셸에서) :

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

편집 : git diffHolger의 의견에 따라 명령을 수정했습니다 .


64
그 주 git diff스크립트에 사용해서는 안 "도자기"명령입니다. 당신이 가장 원하는 것은 git diff-index --quiet HEAD || git commit -m 'bla'. 이 답변 도 참조하십시오 .
Holger 2013

1
더 설명하자면 문제 git diff --quiet --exit-code --cached1커밋을 위해 준비되지 않은 수정 된 파일 (추가되지 않은 파일)에 대해서만 (false)로 평가된다는 것입니다 . 찬성 댓글은 새 파일 및 삭제를 설명하는 가장 좋은 솔루션입니다.
Jorge Bucaran 2014

2
에 대한 의견은 git diff-index --quiet HEAD || git commit -m 'bla'이 질문에 대한 답변이어야합니다.
Rakib

1
Tobi는 Holger의 의견에 따라 답변을 수정하는 데 신경 쓰지 않았기 때문에 자신의 답변을 직접 수정했습니다.
vog

git diff-index --quiet HEAD는 로컬 저장소가 원본과 함께 최신인지 테스트하지 않습니다.
bortzmeyer

62

로부터 git commit매뉴얼 페이지

--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
이것은 실제로 커밋을 생성합니다.
ThiefMaster 2011

6
@ThiefMaster : 맞습니다. 나는 이것이 문제인지 아닌지 OP에서 말할 수 없습니다. 나는 당신이 자동 커밋을 사용하고 있다면 어쨌든 당신의 히스토리가 깨끗한 것에 신경 쓰지 않는 것 같습니다.
Sven Marnach 2011

1
피할 수 있다면 커밋하지 않는 것이 좋습니다. 그렇게하는 방법이 있습니까?
kojiro

3
이 질문에 답변을하지 않습니다
manojlds

7
@manojlds : "물론 OP는 빈 커밋을 만들고 싶지 않습니다." 오늘 수정 구슬을 집에두고 왔기 때문에 몰랐습니다. 를 놓쳤지만 -p여전히
Sven Marnach

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

이로 인해 패브릭이 실패를 무시합니다. 빈 커밋을 생성하지 않는 이점이 있습니다.

with hide('warnings'):출력을 완전히 억제하기 위해 추가 레이어로 래핑 할 수 있습니다 . 그렇지 않으면 패브릭 출력에 커밋이 실패했다는 메모가 표시되지만 fabfile은 계속 실행됩니다.


3
OP는 " 실제 커밋 실패 를 감지하고 싶습니다"라고 썼습니다 . 이 코드는 커밋 실패를 모두 숨 깁니다 .
bfontaine

-2

시도 / 잡기 아기!

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
비추천을받는 이유를 설명하려면 : 잡으려는 다른 오류가있을 수 있습니다. 오류가 발생하더라도 커밋 할 필요가 없다고 가정하고 싶지는 않습니다. -또한, 그러나 그것은 관련이 없습니다 : 제네릭 except:을 사용 except Exception하지 말고 대신 사용하십시오.
알버트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.