web-dev-qa-db-ja.com

現在のディレクトリがGitリポジトリかどうかを確認します

ZshでGit管理用の一連のスクリプトを書いています。

現在のディレクトリがGitリポジトリかどうかを確認するにはどうすればよいですか? (Gitリポジトリにいないときは、一連のコマンドを実行してfatal: Not a git repository応答の束を取得する必要はありません)。

157
anon

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
135
jabbie

次を使用できます。

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

Gitリポジトリの作業ツリーにいる場合、これは「true」を出力します。

Gitリポジトリの外にいる場合(および 'false'を出力しない場合)、STDERRに出力を返すことに注意してください。

この回答から: https://stackoverflow.com/a/2044714/1298

98
TM.

Git rev-parse --git-dirを使用します

 if git rev-parse --git-dir>/dev/null 2>&1; then 
:#これは有効なgitリポジトリです(ただし、現在作業中の
#ディレクトリは最上位ではない可能性があります。
#git rev-parseコマンドの出力を確認if 
 else 
:#これはgitリポジトリではありません
 fi 
40
William Pursell

または、これを行うことができます:

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
18
Alex Cory

これを行うための公的にアクセス可能な/文書化された方法があるかどうかはわかりません(gitソース自体で使用/悪用できる内部git関数がいくつかあります)

次のようなことができます。

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

別の解決策は、コマンドの終了コードを確認することです。

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

Gitリポジトリフォルダーにいる場合、これは1を出力します。

6
user2095363

非常に高速なオプションは http://vc.gerg.ca/hg/vcprompt/ .. multi-VC、Cで、それ以外の依存関係はありません。

3
peritus

Zshディストリビューションで既に機能をチェックしましたか? zshのvcs_infoについて このブログエントリ を参照してください。

UPDATE

元のリンクが削除され、作成者がプライマリドメインを変更したようです。私はグーグルをチェックし、現在リンクされている投稿には同じコンテンツがあると思いますが、確かではありません(元のリンクをチェックしてからずっと前です)。

2
MBO

@ Alex Coryの回答 に基づく:

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

冗長な操作は含まれておらず、-eモードで動作します。

  • @ go2nullが述べたように 、これは裸のレポでは機能しません。何らかの理由でむき出しのレポで作業する場合は、git rev-parseが成功したかどうかを確認し、その出力を無視します。
    • 上記の行はスクリプト用であり、事実上すべてのgitコマンドはワークツリー内でのみ有効であるため、これを欠点とは見なしません。したがって、スクリプト作成の目的では、「gitリポジトリ」内だけでなく、ワークツリー内にいることに関心がある可能性が高いでしょう。
2
ivan_pozdeev

これは私のために動作します。それでもエラーは発生しますが、簡単に抑制できます。また、サブフォルダー内からも機能します!

git status>/dev/null 2>&1 && echo Hello World!

条件付きでさらに行う必要がある場合は、if thenステートメントにこれを配置できます。

1
CharlesTWall3

Zshrcの$ PS1に one または another git-Promptツールを追加または置換できます。このようにすると、gitリポジトリにいて、リポジトリの状態にあるかどうかを簡単に知ることができます。

1
jxqz

#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
0
Pascal Andy

終了コードを使用しないのはなぜですか?現在のディレクトリにgitリポジトリが存在する場合、git branchおよびgit tagコマンドは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
0
MAChitgarha

この回答では、@ 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
0
go2null