检查当前目录是否是Git存储库

时间:2010-02-01 21:40:44

标签: git zsh

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

如何检查当前目录是否为Git存储库? (当我不在Git仓库中时,我不想执行一堆命令并得到一堆fatal: Not a git repository响应。

15 个答案:

答案 0 :(得分:127)

从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 ] || git rev-parse --git-dir > /dev/null 2>&1

答案 1 :(得分:88)

您可以使用:

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

如果您在git repos工作树中,那将打印'true'。

请注意,如果您不在git仓库中,它仍然会将输出返回给STDERR(并且不会打印'false')。

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

答案 2 :(得分:39)

使用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

答案 3 :(得分:15)

或者你可以这样做:

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

答案 4 :(得分:6)

不确定是否有可公开访问/记录的方法(有一些内部git函数可以在git源本身中使用/滥用)

你可以这样做;

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

答案 5 :(得分:5)

另一种解决方案是检查命令的退出代码。

git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1

如果您在git存储库文件夹中,则会打印1。

答案 6 :(得分:2)

基于@Alex Cory's answer

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

不包含任何多余的操作,并且可以在-e模式下工作。

  • As @go2null noted,这在裸仓库中将不起作用。如果出于某种原因要使用裸仓库,则可以检查git rev-parse是否成功,而忽略其输出。
    • 我不认为这是一个缺点,因为上面的行是为了编写脚本而设计的,并且实际上所有git命令仅在工作树中有效。因此,出于脚本目的,您最有可能不仅在“ git repo”中,而且在工作树中。

答案 7 :(得分:1)

这对我有用。你仍然会得到错误,但它们很容易被压制。它也可以在子文件夹中工作!

git status&gt; / dev / null 2&gt;&amp; 1 &amp;&amp; echo Hello World!

如果您需要有条件地做更多事情,可以将其放在if then语句中。

答案 8 :(得分:1)

您可以使用oneanother git-prompt工具在zshrc中添加或替换$ PS1。通过这种方式,您可以方便地了解您是否处于git仓库并且回购状态是否存在。

答案 9 :(得分:0)

此答案提供了一个示例POSIX shell函数以及一个用于补充@jabbie的answer的用法示例。

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

git如果在git存储库中,则返回错误级别0,否则返回错误级别128。 (如果它位于git存储库中,则它还会返回truefalse。)

用法示例

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

答案 10 :(得分:0)

#检查git repo

.login-box{
   position: absolute;
   top: 3em;
   left: 54%;
   right: 20%;
   text-align: left;
   @media screen and (max-width: 768px){
       background: white;
       position: relative;
       top: 0;
       left: 0;
       width: 90%;
       height: 30em;
       margin: 2em 0;
       padding: 1em;
       }
}

答案 11 :(得分:0)

为什么不使用退出代码?如果当前目录中存在git存储库,则git branchgit tag命令返回退出代码0;否则,退出代码为0。否则,将返回非零的退出代码。这样,您可以确定git存储库是否存在。简单地,您可以运行:

git tag > /dev/null 2>&1 && [ $? -eq 0 ]

优势:Flexibe。它适用于裸仓库和非裸仓库以及sh,zsh和bash。

说明

  1. git tag:获取存储库的标签以确定是否存在。
  2. > /dev/null 2>&1:防止打印任何内容,包括正常和错误输出。
  3. [ $? -eq 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

答案 12 :(得分:0)

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命令。内置的 type 命令用于检查是否已安装git或它是否在PATH中。请参见帮助类型

答案 13 :(得分:0)

在 linux 中的终端或 windows 上的 cmd 中打开该目录并输入 git status,这在 2021 年应该足以告诉你你在一个 git repo 中,并且你有 x 个分支和 { {1}} 次提交。

答案 14 :(得分:-1)

! 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 仅用于打印一些消息 和git status打印仓库的状态。

将其包装在函数中或放入脚本中。希望这会有所帮助