Я пишу серию скриптов для управления Git в zsh.
Как проверить, является ли текущий каталог репозиторием Git? (Когда я не в репозитории Git, я не хочу выполнять кучу команд и получать кучу ответов fatal: Not a git repository
).
Я пишу серию скриптов для управления Git в zsh.
Как проверить, является ли текущий каталог репозиторием 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;
Вы можете либо обернуть это в функцию, либо использовать его в script.
Сжатый в однострочное условие, подходящее для bash или zsh
[ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1
Вы можете использовать:
git rev-parse --is-inside-work-tree
Что будет печатать 'true', если вы находитесь в рабочем дереве git repos.
Обратите внимание, что он все равно возвращает вывод в STDERR, если вы находитесь за пределами репозитория git (и не печатаете "false" ).
Взято из этого ответа: fooobar.com/questions/52238/...
Используйте 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
Или вы можете это сделать:
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.
UPDATE:
Кажется, что исходная ссылка была удалена, и автор изменил свой основной домен. Я проверил Google, и я думаю, что связанная с ним почта имеет один и тот же контент, но я точно не знаю (было давно, так как я проверил исходную ссылку).
это работает для меня. Вы все еще получаете ошибки, но их достаточно легко подавить. он также работает изнутри подпапок!
git status > /dev/null 2 > & 1 && & echo Hello World!
Вы можете поместить это в оператор if then, если вам нужно условно сделать больше.
Вы можете добавить или заменить свой PS1 в своем zshrc one или еще git -простые инструменты. Таким образом, вы можете быть легко проинформированы о том, находитесь ли вы в репозитории git и состояние репо находится.
См. также:
git rev-parse --is-inside-work-tree
(обнаружен при чтении man git -rev-parse)
! 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 для печати статуса репо.
Оберните его в функцию или поместите в скрипт. Надеюсь это поможет
Этот ответ предоставляет пример функции оболочки 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
На основании ответа @Alex Cory:
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
не содержит избыточных операций и работает в режиме -e
.
git rev-parse
преуспел, игнорируя его вывод. git
действительны только внутри рабочей строки.