ZshでGit管理用の一連のスクリプトを書いています。
現在のディレクトリがGitリポジトリかどうかを確認するにはどうすればよいですか? (Gitリポジトリにいないときは、一連のコマンドを実行してfatal: Not a git repository
応答の束を取得する必要はありません)。
Bash完了ファイルからコピーされた次のコードは、それを行うための単純な方法です。
# Copyright (C) 2006,2007 Shawn O. Pearce <[email protected]>
# 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 ] || git rev-parse --git-dir > /dev/null 2>&1
次を使用できます。
git rev-parse --is-inside-work-tree
Gitリポジトリの作業ツリーにいる場合、これは「true」を出力します。
Gitリポジトリの外にいる場合(および 'false'を出力しない場合)、STDERRに出力を返すことに注意してください。
Git rev-parse --git-dirを使用します
if git rev-parse --git-dir>/dev/null 2>&1; then :#これは有効なgitリポジトリです(ただし、現在作業中の #ディレクトリは最上位ではない可能性があります。 #git rev-parseコマンドの出力を確認if else :#これは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ソース自体で使用/悪用できる内部git関数がいくつかあります)
次のようなことができます。
if ! git ls-files >& /dev/null; then
echo "not in git"
fi
別の解決策は、コマンドの終了コードを確認することです。
git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1
Gitリポジトリフォルダーにいる場合、これは1を出力します。
非常に高速なオプションは http://vc.gerg.ca/hg/vcprompt/ .. multi-VC、Cで、それ以外の依存関係はありません。
Zshディストリビューションで既に機能をチェックしましたか? zshのvcs_infoについて このブログエントリ を参照してください。
UPDATE:
元のリンクが削除され、作成者がプライマリドメインを変更したようです。私はグーグルをチェックし、現在リンクされている投稿には同じコンテンツがあると思いますが、確かではありません(元のリンクをチェックしてからずっと前です)。
@ Alex Coryの回答 に基づく:
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
冗長な操作は含まれておらず、-e
モードで動作します。
git rev-parse
が成功したかどうかを確認し、その出力を無視します。git
コマンドはワークツリー内でのみ有効であるため、これを欠点とは見なしません。したがって、スクリプト作成の目的では、「gitリポジトリ」内だけでなく、ワークツリー内にいることに関心がある可能性が高いでしょう。これは私のために動作します。それでもエラーは発生しますが、簡単に抑制できます。また、サブフォルダー内からも機能します!
git status>/dev/null 2>&1 && echo Hello World!
条件付きでさらに行う必要がある場合は、if thenステートメントにこれを配置できます。
#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
終了コードを使用しないのはなぜですか?現在のディレクトリに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
この回答では、@ jabbieの answer を補完するサンプルPOSIXシェル関数と使用例を示します。
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