zsh에서 Git 관리를위한 일련의 스크립트를 작성하고 있습니다.
현재 디렉토리가 Git 저장소인지 어떻게 확인합니까? (Git 리포지토리에 있지 않을 때는 많은 명령을 실행하고 많은 fatal: Not a git repository
응답을 얻고 싶지 않습니다 ).
$GIT_DIR
또는 $GIT_WORK_TREE
환경 변수를 고려하지 않습니다 .
zsh에서 Git 관리를위한 일련의 스크립트를 작성하고 있습니다.
현재 디렉토리가 Git 저장소인지 어떻게 확인합니까? (Git 리포지토리에 있지 않을 때는 많은 명령을 실행하고 많은 fatal: Not a git repository
응답을 얻고 싶지 않습니다 ).
$GIT_DIR
또는 $GIT_WORK_TREE
환경 변수를 고려하지 않습니다 .
답변:
bash 완성 파일에서 복사 한 다음은 순진한 방법입니다.
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
# Distributed under the GNU General Public License, version 2.0.
if [ -d .git ]; then
echo .git;
else
git rev-parse --git-dir 2> /dev/null;
fi;
함수로 감싸거나 스크립트에서 사용할 수 있습니다.
bash 및 zsh에 적합한 한 줄 조건으로 압축
[ -d .git ] && echo .git || git rev-parse --git-dir > /dev/null 2>&1
git rev-parse --is-inside-git-dir
. git rev-parse --is-inside-work-tree
PS1을 설정하기 전에 개인적으로 사용 합니다.
--is-inside-git-dir
은 실제로 저장소 의 .git
디렉토리 안에있는 경우에만 true를 반환 합니다. 나는 OP가 그것을 찾고 있다고 생각하지 않습니다.
--is-inside-work-tree
않습니다 --is-inside-git-dir
. 참조 : groups.google.com/forum/#!topic/git-users/dWc23LFhWxE
.git
. 견고성을 위해를 생략하고 [ -d .git ]
사용하십시오 git rev-parse ...
.
당신이 사용할 수있는:
git rev-parse --is-inside-work-tree
git repos 작업 트리에 있으면 'true'로 인쇄됩니다.
자식 저장소 외부에 있고 'false'를 인쇄하지 않으면 여전히 STDERR로 출력을 반환합니다.
이 답변에서 가져온 것 : https : //.com/a/2044714/12983
git rev-parse --show-toplevel
중인 하위 폴더와 일치 하는지 확인해야합니다.
또는 당신은 이것을 할 수 있습니다 :
inside_git_repo="$(git rev-parse --is-inside-work-tree 2>/dev/null)"
if [ "$inside_git_repo" ]; then
echo "inside git repo"
else
echo "not in git repo"
fi
@Alex Cory의 답변을 바탕으로 :
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
중복 작업을 포함하지 않으며 -e
모드 에서 작동 합니다.
git rev-parse
출력을 무시하고 성공 여부 만 확인할 수 있습니다 .
git
명령은 작업 트리 내에서만 유효 하기 때문에이 단점을 고려하지 않습니다 . 따라서 스크립팅 목적으로 "git repo"내부가 아닌 작업 트리 내부에 관심이있을 것입니다.[
. 그냥 이렇게 if git rev-parse --is-inside-work-tree; then ...
(원하는대로 리디렉션으로.)
다른 해결책은 명령의 종료 코드를 확인하는 것입니다.
git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1
git repository 폴더에 있으면 1이 인쇄됩니다.
.git
디렉토리 내부에 있어도 rc 0을 가질 수 있습니다.
git rev-parse 2>&-
.
이 답변은 샘플 POSIX 셸 함수와 @ jabbie 's answer 를 보완하는 사용 예제를 제공합니다 .
is_inside_git_repo() {
git rev-parse --is-inside-work-tree >/dev/null 2>&1
}
git
0
git 저장소 내에 있으면 errorlevel을 반환하고, 그렇지 않으면 errorlevel을 반환합니다 128
. (또한 반환 true
되거나 false
git 저장소 내에있는 경우)
사용 예
for repo in *; do
# skip files
[ -d "$repo" ] || continue
# run commands in subshell so each loop starts in the current dir
(
cd "$repo"
# skip plain directories
is_inside_git_repo || continue
printf '== %s ==\n' "$repo"
git remote update --prune 'origin' # example command
# other commands here
)
done
.git
에서는 성공하지만 인쇄 할 것 false
입니다.
git rev-parse --is-inside-work-tree
반환 true
또는 false
다음이 있다 힘내의 repo 내에서, 그 어떤 함수가 반환됩니다. 즉, 기능이 정확합니다
이것은 나를 위해 작동합니다. 여전히 오류가 발생하지만 쉽게 억제 할 수 있습니다. 하위 폴더 내에서도 작동합니다!
자식 상태> / dev / null 2> & 1 && echo Hello World!
조건부로 더 많은 작업을 수행해야하는 경우이를 if then 문에 넣을 수 있습니다.
git status
큰 / 오래된 레포에서 매우 느려질 수 있습니다. 나는 이것을 목적으로 사용하지 않을 것입니다.
종료 코드를 사용하지 않는 이유는 무엇입니까? 자식 저장소는 현재 디렉토리에있는 경우, 다음 git branch
과 git tag
명령 0의 종료 코드를 반환; 그렇지 않으면 0이 아닌 종료 코드가 리턴됩니다. 이런 식으로 git 저장소가 존재하는지 여부를 결정할 수 있습니다. 간단히 다음을 실행할 수 있습니다.
git tag > /dev/null 2>&1 && [ $? -eq 0 ]
이점 : Flexibe. 베어 및 비 베어 리포지토리와 sh, zsh 및 bash에서 모두 작동합니다.
git tag
: 존재 여부를 판별하기 위해 저장소의 태그 가져 오기> /dev/null 2>&1
: 정상 및 오류 출력을 포함하여 아무것도 인쇄하지 않습니다.[ $? -eq 0 ]
: 이전 명령이 종료 코드 0으로 리턴되었는지 확인하십시오. 아시다시피, 0이 아닌 모든 종료는 잘못된 일이 발생했음을 의미합니다. $?
이전 명령의 종료 코드를 가져오고 [
, -eq
및 ]
비교를 수행합니다.예를 들어, check-git-repo
다음 내용으로 이름이 지정된 파일을 작성 하고 실행 가능하게하여 실행할 수 있습니다.
#!/bin/sh
if git tag > /dev/null 2>&1 && [ $? -eq 0 ]; then
echo "Repository exists!";
else
echo "No repository here.";
fi
# git repo인지 확인
if [ $(git rev-parse --is-inside-work-tree) = true ]; then
echo "yes, is a git repo"
git pull
else
echo "no, is not a git repo"
git clone url --depth 1
fi
[
. 그냥 할 :if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
if ! [[ $(pwd) = *.git/* || $(pwd) = *.git ]]; then
if type -P git >/dev/null; then
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
printf '\n%s\n\n' "GIT repository detected." && git status
}
fi
fi
ivan_pozdeev 감사합니다 . 이제 .git 디렉토리 내부에서 코드가 실행되지 않아 오류가 인쇄되지 않거나 잘못된 종료 상태가 아닌지 테스트합니다.
" ! [[$ (pwd) = .git / || $ (pwd) = * .git]] "는 .git 저장소에 있지 않은 경우 git 명령을 실행합니다. 내장 유형 명령은 git이 설치되어 있는지 또는 PATH 내에 있는지 확인하는 데 사용됩니다. 도움말 유형을 참조하십시오
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
printf '%s\n\n' "GIT repository detected." && git status
}
! git repo가 아닌 디렉토리에서 이것을 실행하더라도 치명적인 오류는 발생하지 않습니다.
>을 / dev / null 2> & 1 메시지를 전송하는 을 / dev / null 당신은 종료 상태 쫓고 있기 때문이다. 는 {} 애프터 모든 명령 때문에 명령 그룹에 대한 있습니다 || 우리가!를 사용한 이후 git rev-parse가 성공하면 실행됩니다! git rev-parse의 종료 상태를 무효화했습니다. 의 printf는 단지 REPO의 상태를 인쇄 할 몇 가지 메시지와 자식 상태를 인쇄하는 것입니다.
함수로 감싸거나 스크립트에 넣으십시오. 도움이 되었기를 바랍니다
.git
에서는 성공하지만 인쇄 할 것 false
입니다.