我正在zsh中编写Git管理的一系列脚本。

如何检查当前目录是否是Git存储库?(当我不在Git repo时,我不想执行一堆命令并得到一堆致命的:不是Git存储库响应)。


当前回答

你可以使用:

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

这将打印'true'如果你在一个git回购工作树。

注意,如果你在git repo之外,它仍然返回输出到STDERR(并且不打印'false')。

这个答案是:https://stackoverflow.com/a/2044714/12983

其他回答

使用 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- topllevel,所以你可以测试"$(pwd)"= "$(git rev-parse——show-toplevel)"来确定当前目录是否是顶级目录。

根据@Alex Cory的回答:

[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]

不包含任何冗余操作,工作在-e模式。

正如@go2null指出的那样,这将在裸回购中不起作用。如果你出于任何原因想要使用一个裸回购,你可以检查git rev-parse是否成功,忽略它的输出。 我不认为这是一个缺点,因为上面的行是缩进的脚本,实际上所有的git命令都只在工作树中有效。因此,出于编写脚本的目的,您很可能不仅对“git repo”感兴趣,而且对工作树感兴趣。

##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)

这个回答提供了一个示例POSIX shell函数和一个使用示例来补充@jabbie的回答。

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

如果它在Git存储库中,Git将返回errorlevel 0,否则将返回errorlevel 128。(如果它在git存储库中,它也会返回true或false。)

使用的例子

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是否回购

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