我正在zsh中为Git管理编写一系列脚本。
如何检查当前目录是否为Git存储库?(当我不在Git存储库中时,我不想执行一堆命令并获得一堆fatal: Not a git repository
响应)。
$GIT_DIR
或$GIT_WORK_TREE
环境变量,或它们如何相互作用。
我正在zsh中为Git管理编写一系列脚本。
如何检查当前目录是否为Git存储库?(当我不在Git存储库中时,我不想执行一堆命令并获得一堆fatal: Not a git repository
响应)。
$GIT_DIR
或$GIT_WORK_TREE
环境变量,或它们如何相互作用。
Answers:
从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 --is-inside-git-dir
。git rev-parse --is-inside-work-tree
设置PS1之前,我个人使用过。
--is-inside-git-dir
仅在您实际上位于存储库.git
目录中时才返回true 。我不认为OP在寻找那个。
.git
。,这将失败。为了增强鲁棒性,请省略[ -d .git ]
和,然后使用git rev-parse ...
。
您可以使用:
git rev-parse --is-inside-work-tree
如果您在git repos工作树中,它将显示“ true”。
请注意,如果您不在git repo之外,它仍会将输出返回到STDERR(并且不会显示“ false”)。
从此答案中获取:https : //stackoverflow.com/a/2044714/12983
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
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
不包含任何冗余操作,并且在-e
模式下工作。
git rev-parse
成功,而忽略其输出。
git
命令仅在工作树中有效。因此,出于脚本目的,您最有可能不仅在“ git repo”中,而且在工作树中也很感兴趣。[
。随便做if git rev-parse --is-inside-work-tree; then ...
(根据需要进行重定向。)
另一个解决方案是检查命令的退出代码。
git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1
如果您位于git资料夹文件夹中,则会显示1。
.git
目录中,该目录也将具有rc 0 ,您可能想要也可能不想要。
git rev-parse 2>&-
。
该答案提供了一个示例POSIX Shell函数和一个用法示例,以补充@jabbie的答案。
is_inside_git_repo() {
git rev-parse --is-inside-work-tree >/dev/null 2>&1
}
git
返回ERRORLEVEL 0
如果它是一个Git仓库里面,否则返回错误级别128
。(它也返回,true
或者false
它是否在git存储库中。)
使用范例
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
,它将成功但可以打印false
。
git rev-parse --is-inside-work-tree
退货true
或false
则是一个git仓库内,而这正是该函数返回。也就是说,该功能是正确的
这对我有用。您仍然会收到错误,但是它们很容易消除。它也可以在子文件夹中使用!
git status> / dev / null 2>&1 &&回声Hello World!
如果您需要有条件地执行更多操作,则可以将其放在if then语句中。
git status
大/旧仓库可能非常慢。我不会将其用于此目的。
为什么不使用退出代码?如果当前目录中存在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
#检查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
[
这里调用。只需做:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
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命令。内置类型命令用于检查您是否已安装git或它是否在PATH中。查看帮助类型
! 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状态打印回购的状态。
将其包装在函数中或放入脚本中。希望这可以帮助
.git
,它将成功但可以打印false
。