Проверьте, является ли текущий каталог репозиторием Git

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

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

12 ответов


скопировано из файла завершения 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;

Вы можете либо обернуть это в функцию и использовать его в скрипте.

Сконденсированный в одну линию условие соответствующее для Баш или ЗШ

[ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1

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

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

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

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

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


использовать git Рэв-разобрать --ГИТ-реж

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

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

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

это будет печатать 1, Если вы находитесь в папке репозитория git.


очень быстрый вариант http://vc.gerg.ca/hg/vcprompt/ .. multi-VC, в C, никаких зависимостей, кроме себя.


вы уже проверили функции в дистрибутиве zsh? См.запись в блоге о vcs_info в zsh.

обновление:

похоже, что исходная ссылка была удалена, и автор изменил свой основной домен. Я проверил google, и я думаю, что в настоящее время связанный пост имеет тот же контент, но я не знаю точно (это было давно, так как я проверил оригинальную ссылку).


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

состояние git >/dev / null 2>&1 && Echo Привет Мир!

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


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


! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { 
  printf '%s\n\n' "GIT repository detected." && git status
}

The ! отрицает, поэтому, даже если вы запустите это в каталоге, который не является РЕПО git, это не даст вам некоторых фатальных ошибок

на >/dev / null 2>&1 отправляет сообщения /dev / null так как вы сразу после статуса выхода. The {} предназначены для групп команд, поэтому все команды после // будет работать, если git rev-parse удалось, так как мы используем a ! что отрицало статус выхода git rev-parse. Этот printf просто распечатать какое-то сообщение и статус git для печати статуса РЕПО.

оберните его в функцию или поместите в скрипт. Надеюсь, это поможет


Читайте также:

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

(обнаружен при чтении man git-rev-parse)