개발/Python

[파이썬] 오류없이 아무것도 커밋하지 않는 방법은?

MinorMan 2022. 10. 24. 03:56
반응형

<질문>

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

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

<답변1>

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

예를 들어(쉘에서):

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

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


<답변2>

로부터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.

<답변3>

그냥 연장Tobi & Holger의 명시적인 답변if성명.

git add -A
if ! git diff-index --quiet HEAD; then
  git commit -m "Message here"
  git push origin main
fi

약간의 설명을 해보자.

  1. git add -A : 변경 사항 준비(다음 단계에 필요)

  2. git diff-index --quiet HEAD단계적 변경 사항 을 HEAD와 비교합니다.

    --quiet 은 "차이가 있는 경우 프로그램을 코드 1로 종료하고 0은 차이가 없음을 의미하는" --exit-code 를 의미하므로 중요합니다.

보다--quiet.


<답변4>

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

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

추가 레이어로 감쌀 수 있습니다.with hide('warnings'):출력을 완전히 억제하지 않으면 패브릭 출력에 커밋이 실패했다는 메모가 표시됩니다(그러나 fabfile은 계속 실행됨).


<답변5>

쉘을 통과할 때 다음을 사용할 수 있습니다.... || true예상하고 무시할 실패를 선언하는 기술:

git commit -a -m "beautiful commit" || true

이것은 또한 사용할 때 쉘 스크립트가 종료되는 것을 방지합니다.errexit옵션.

대신에... || true다음과 같이 반환 코드 0으로 종료되는 다른 명령을 사용할 수도 있습니다.

git commit -a -m "beautiful commit" || echo "ignore commit failure, proceed"

<답변6>

아기를 잡아보세요!

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))
반응형