Проверьте, является ли текущий каталог Git-репозиторием - PullRequest
155 голосов
/ 02 февраля 2010

Я пишу серию скриптов для управления Git в zsh.

Как проверить, является ли текущий каталог репозиторием Git? (Когда я не в репозитории Git, я не хочу выполнять кучу команд и получать кучу fatal: Not a git repository ответов).

Ответы [ 12 ]

131 голосов
/ 02 февраля 2010

Скопированный из файла завершения 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
96 голосов
/ 04 июня 2013

Вы можете использовать:

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

Который напечатает 'true', если вы находитесь в рабочем дереве git-репозиториев.

Обратите внимание, что он по-прежнему возвращает вывод в STDERR, если вы находитесь за пределами git-репо (и не печатает 'false').

Взято из этого ответа: https://stackoverflow.com/a/2044714/12983

39 голосов
/ 02 февраля 2010

Использовать 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
17 голосов
/ 29 июня 2016

Или вы можете сделать это:

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
6 голосов
/ 02 февраля 2010

Не уверен, есть ли общедоступный / документированный способ сделать это (есть некоторые внутренние функции git, которые вы можете использовать / использовать в самом источнике git)

Вы можете сделать что-то вроде;*

if ! git ls-files >& /dev/null; then
  echo "not in git"
fi
5 голосов
/ 14 декабря 2015

Другое решение заключается в проверке кода завершения команды.

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

При выводе в папку git-репозитория выводится 1.

2 голосов
/ 19 ноября 2018

На основании @ ответа Алекса Кори :

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

не содержит никаких избыточных операций и работает в режиме -e.

  • Как заметил @ go2null , это не будет работать в голом репо. Если по какой-либо причине вы хотите работать с голым репо, вы можете просто проверить, успешно ли git rev-parse, игнорируя его вывод.
    • Я не считаю это недостатком, поскольку приведенная выше строка имеет отступ для сценариев, и практически все команды git действительны только внутри рабочего дерева. Поэтому в целях написания сценариев вы, скорее всего, заинтересованы в том, чтобы быть не просто внутри «git repo», а внутри рабочего дерева.
1 голос
/ 25 октября 2014

Вы можете добавить или заменить свой $ PS1 в zshrc на один или другой инструмент git-prompt. Таким образом, вы можете легко узнать, находитесь ли вы в git-репо и в каком состоянии репо.

1 голос
/ 19 января 2014

это работает для меня.Вы по-прежнему получаете ошибки, но их достаточно легко устранить.он также работает из подпапок!

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

Вы можете поместить это в оператор if ifвам нужно условно сделать больше.

0 голосов
/ 17 декабря 2018

# проверить, если 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
...