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

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

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

Ответ 1

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

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

Сжатый в однострочное условие, подходящее для bash или zsh

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

Ответ 2

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

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

Что будет печатать 'true', если вы находитесь в рабочем дереве git repos.

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

Взято из этого ответа: fooobar.com/questions/52238/...

Ответ 3

Используйте 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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

UPDATE:

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

См. также:

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

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

Ответ 12

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

! отрицает, поэтому, даже если вы запустите это в директории, которая не является git repo, она не даст вам некоторых фатальных ошибок

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

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

Ответ 13

Этот ответ предоставляет пример функции оболочки POSIX и пример использования для дополнения ответа @jabbie.

is_inside_git_repo() {
    git rev-parse --is-inside-work-tree >/dev/null 2>&1
}

git возвращает errorlevel 0 если он находится в репозитории git, иначе он возвращает уровень ошибок 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

Ответ 14

На основании ответа @Alex Cory:

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

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

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