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

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


当前回答

这个回答提供了一个示例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 rev-parse --is-inside-work-tree

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

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

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

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

为什么不用退出码?如果当前目录中存在git存储库,则git分支和git标记命令返回退出码为0;否则,将返回非零退出代码。通过这种方式,您可以确定git存储库是否存在。简单地说,你可以运行:

git tag > /dev/null 2>&1

优点:便于携带。它既适用于裸库,也适用于非裸库,以及在sh、zsh和bash中。

解释

git标签:获取存储库的标签,以确定是否存在。 > /dev/null 2>&1:阻止打印任何东西,包括正常和错误输出。

TLDR(真的吗?!):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

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

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