source

현재 디렉터리가 Git 리포지토리인지 확인합니다.

manysource 2023. 5. 20. 10:56

현재 디렉터리가 Git 리포지토리인지 확인합니다.

저는 zsh에서 Git 관리를 위한 일련의 스크립트를 작성하고 있습니다.

현재 디렉터리가 Git 저장소인지 확인하려면 어떻게 해야 합니까? (Gitrepo에 있지 않을 때는 여러 명령을 실행하고 여러 명령을 사용하지 않습니다.fatal: Not a git repository응답).

사용할 수 있는 항목:

git rev-parse --is-inside-work-tree

Git repos 작업 트리에 있는 경우 STDOUT에 'true'가 인쇄됩니다.

Git repo를 벗어나면('false'는 인쇄되지 않음) 여전히 STDERR로 출력을 반환합니다.

다음 답변에서 발췌: https://stackoverflow.com/a/2044714/12983

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 --git-dir 사용

if git rev-parse --git-dir > /dev/null 2>&1; then
  : # This is a valid git repository (but the current working
    # directory may not be the top level.
    # Check the output of the git rev-parse command if you care)
else
  : # this is not a git repository
fi

편집:git-rev-parse이제 (1.7.0 기준) 지원--show-toplevel그래서 당신은 할 수 있습니다.if test "$(pwd)" = "$(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모드

  • @go2null이 지적했듯이, 이것은 맨 레포에서 작동하지 않을 입니다.어떤 이유로든 맨 레포로 작업하려면 다음을 확인하면 됩니다.git rev-parse성공했습니다. 출력을 무시합니다.
    • 위의 행은 스크립팅을 위한 것이고, 사실상 모든 것이기 때문에 저는 이것이 단점이라고 생각하지 않습니다.git명령은 작업 트리 내에서만 유효합니다.따라서 스크립팅 목적으로 "git repo" 내부뿐만 아니라 작업 트리 내부에도 관심이 있을 가능성이 높습니다.

공개적으로 액세스할 수 있는/문서화된 방법이 있는지 확실하지 않습니다(Git 소스 자체에서 사용/남용할 수 있는 일부 내부 Git 함수가 있음).

당신은 다음과 같은 것을 할 수 있습니다.

if ! git ls-files >& /dev/null; then
  echo "not in git"
fi

이 답변은 샘플 POSIX 셸 함수와 @jabbie의 답변을 보완하기 위한 사용 예를 제공합니다.

is_inside_git_repo() {
    git rev-parse --is-inside-work-tree >/dev/null 2>&1
}

git오류 수준을 반환합니다.0Git 저장소 내부에 있으면 오류 수준을 반환합니다.128(또한 반환됩니다.true또는falsegit 저장소 내부에 있는 경우.)

사용 예

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 rev-parse 2> /dev/null; [ $? == 0 ] && echo 1

Git 저장소 폴더에 있는 경우 1이 인쇄됩니다.

종료 코드를 사용하지 않는 이유는 무엇입니까?현재 디렉터리에 git 저장소가 있는 경우git branch그리고.git tag명령은 종료 코드 0을 반환합니다. 그렇지 않으면 0이 아닌 종료 코드가 반환됩니다.이렇게 하면 Git 저장소의 존재 여부를 확인할 수 있습니다.간단히 다음을 실행할 수 있습니다.

git tag > /dev/null 2>&1

장점:휴대용.bare 저장소와 non-bare 저장소 모두에서 작동하며 sh, zsh 및 bash에서 작동합니다.

설명.

  1. git tag존재 여부를 확인하기 위해 리포지토리의 태그를 가져오는 중입니다.
  2. > /dev/null 2>&1정상 및 오류 출력을 포함하여 인쇄할 수 없습니다.

TLDR():Really?!check-git-repo

를 들어, 예를들, 다같이파의라는 이름의 수 .check-git-repo다음 내용을 사용하여 실행 파일로 만들고 실행합니다.

#!/bin/sh

if git tag > /dev/null 2>&1; 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

이것은 나에게 효과가 있습니다.여전히 오류가 발생하지만 이 오류는 억제하기에 충분히 쉽습니다.하위 폴더 내에서도 작동합니다!

git status >/dev/null 2>&1 && echo Hello World!

조건부로 더 많은 작업이 필요한 경우 이를 if then 문에 넣을 수 있습니다.

##Current branch
echo $(git branch --show-current 2> /dev/null && echo '')
echo $(git branch --show-current 2> /dev/null)

##OR
GIT_DIR=$(git rev-parse --git-dir 2> /dev/null)

언급URL : https://stackoverflow.com/questions/2180270/check-if-current-directory-is-a-git-repository