2017-11-23 44 views
0

git 저장소에 변경 사항이 있는지 확인하고 싶습니다.저장소에 변경 사항이 있는지 확인하는 가장 빠른 방법은 무엇입니까?

나는이 조건

if command git status --porcelain 2> /dev/null | grep -q .; then 
    X 
else 
    Y 
fi 

를 사용하고 있지만, 너무 느리다.

더 빠른 방법이 있습니까? 이 작업을 수행하려면 git 명령을 사용해야합니까, 아니면 해당 명령을 완전히 사용하지 않는 초고속 방법이 있습니까?

+1

것은 당신이 알고 싶은 경우는 자식 상태'여부 --porcelain 2>는/dev/null' 출력 무언가 :'경우이 명령 자식 상태 --porcelain 2 >/dev/null | 읽기 -n1; 그런 다음 "Repo has changes"메시지를 표시합니다. fi'. 우리가 서브 쉘과 외부 명령을 없애고 있기 때문에 현재 테스트보다 더 빠를 것입니다. –

+0

@gniourf_gniourf 왜 '꼬리'에서 '읽음'으로 전환 했습니까? – theonlygusti

+0

'tail'은 외부 명령이고'read'는 내장 명령입니다. 또한'-n1 읽기 '를 사용하여 우리는 오직 하나의 문자 만 읽었을뿐 전체 스트림은 읽지 않습니다. 'grep -q. '에서도 같은 결과를 얻을 수 있지만 grep은 외부 명령이므로'read'보다 느려집니다. –

답변

0

나는 이런 종류의 일에 좋은 --short 옵션을 찾았습니다. 아무것도 변경되지 않은 경우 빈 문자열을 반환합니다.

test -n "$(git status --short)" && echo 'changes detected' || echo 'no change' 

속도 개선 여부는 알 수 없습니다.

+0

나는 속도 만 신경 쓴다. 분명히 이것은 논평 일 수 있었습니까? – theonlygusti

+0

답변에서 형식이 더 명확합니다. 벤치에이 방법을 표시 했습니까? –

0

(편집합니다 GNUism을 제거, 거기에 합리적인 POSIX 전용 테스트) 어떤을 지출하지 않고, 인덱스 및 worktree에서 다른 콘텐츠와 HEAD와 인덱스에 다른 콘텐츠와 경로 및 경로를 나열

if (git diff-index --cached @; git diff-files) | grep -q .; then 
     tracked changes in index or worktree 
else 
     index and tracked worktree content identical to checkout 
fi 

그 차이점을 찾아내는 시간.

응답 시간을 마지막으로 밀리 초 단위로 줄이려면 stdbuf -oL git을 사용하여 git 라인 버퍼 출력을 만들 수 있습니다. 따라서 매우 첫 번째 diff는 즉시 sed를 치고 파이프를 종료합니다. 그렇지 않으면 인쇄하기 전에 수십 개의 발견 된 diff를 버퍼링 할 수 있습니다.

+0

'stdbuf -oL git'을 어떻게 처리합니까? – theonlygusti

+0

re stdbuf, 단지'stdbuf -oL git'을'git' 대신에 사용하십시오. 항상 거짓 부분에 대해서, 나는 그것을 시도하고, 변경하고, 거짓을 표시하고, 재설정한다. 아마도 오타일까요? – jthill

1

힘내 자신의 소스 코드는 좋은 해결책에 대한 힌트를 줄 수 있습니다. require_clean_work_tree 쉘 기능은 본질적으로 원하는 것입니다. 여기에 (에서 개최 변경을보고하지 않음) 짧은 버전입니다 :

git_has_changes() { 
    git update-index -q --ignore-submodules --refresh 
    git diff-files --quiet --ignore-submodules 
} 

if git_has_changes; then 
    echo "has changes" 
else 
    echo "no change" 
fi