我正在为zsh编写一系列Git管理脚本。
如何检查当前目录是否为Git存储库? (当我不在Git仓库中时,我不想执行一堆命令并得到一堆fatal: Not a git repository
响应。
答案 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')。
答案 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)
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
不包含任何多余的操作,并且可以在-e
模式下工作。
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)
答案 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存储库中,则它还会返回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
答案 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 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返回。您可能知道,每个非零出口都意味着发生了一些不好的事情。 $?
获取上一个命令的退出代码,然后[
,-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打印仓库的状态。
将其包装在函数中或放入脚本中。希望这会有所帮助