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
環境変数、またはそれらの相互作用については考慮されていません。
回答:
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に適した1行の条件に圧縮
[ -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リポジトリの外にいる場合でも、出力はSTDERRに返されることに注意してください(「false」を出力しません)。
この回答から引用:https : //stackoverflow.com/a/2044714/12983
git rev-parse --show-toplevel
チェックしているサブフォルダーと一致するかどうかを確認する必要があります
git rev-parse --git-dirを使用します
if git rev-parse --git-dir> / dev / null 2>&1; その後 :#これは有効なgitリポジトリです(ただし、現在の作業 #ディレクトリが最上位でない可能性があります。 #必要に応じてgit rev-parseコマンドの出力を確認してください) そうしないと :#これはgitリポジトリではありません fi
またはこれを行うことができます:
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リポジトリ」内だけでなく、ワークツリー内にも興味がある可能性があります。[
でください。ただ、やる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シェル関数と、@ jabbieの回答を補足する使用例を示します。
is_inside_git_repo() {
git rev-parse --is-inside-work-tree >/dev/null 2>&1
}
git
0
gitリポジトリ内にある場合はerrorlevelを返し、それ以外の場合はerrorlevelを返します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 && echo Hello World!
条件付きでさらに実行する必要がある場合、これをif thenステートメントに入れることができます。
git status
大きな/古いリポジトリでは非常に遅くなる可能性があります。この目的には使用しません。
なぜ終了コードを使わないのですか?Gitのリポジトリが現在のディレクトリに存在する場合、git branch
およびgit tag
コマンド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コマンドを実行します。組み込みのtypeコマンドは、gitがインストールされているかどうか、またはPATH内にあるかどうかを確認するために使用されます。ヘルプの種類を見る
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
printf '%s\n\n' "GIT repository detected." && git status
}
!否定するので、gitリポジトリではないディレクトリでこれを実行しても、致命的なエラーは発生しません
>を/ dev / null 2>&1にメッセージを送信するの/ dev / nullにあなただけの終了ステータス後にしているからです。{}後、コマンドのグループのためにので、すべてのコマンドである|| !を使用しているため、git rev-parseが成功した場合に実行されます。これはgit rev-parseの終了ステータスを無効にしました。printf関数は、ちょうどレポの状況を印刷するためにいくつかのメッセージとgitの状態を印刷することです。
関数で囲むか、スクリプトに入れます。お役に立てれば
.git
では、成功しますが印刷されますfalse
。