Я пишу серию скриптов для управления Git на zsh.
Как проверить, является ли текущий каталог репозиторием Git? (Когда я не использую репозиторий Git, я не хочу выполнять кучу команд и получать кучу fatal: Not a git repository
ответов).
Я пишу серию скриптов для управления Git на zsh.
Как проверить, является ли текущий каталог репозиторием Git? (Когда я не использую репозиторий Git, я не хочу выполнять кучу команд и получать кучу fatal: Not a git repository
ответов).
$GIT_DIR
или $GIT_WORK_TREE
переменные окружения, или как они взаимодействуют.
Ответы:
Скопировано из файла завершения 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 ] && echo .git || git rev-parse --git-dir > /dev/null 2>&1
git rev-parse --is-inside-git-dir
. Я лично использую git rev-parse --is-inside-work-tree
перед установкой PS1.
--is-inside-git-dir
вернет true только в том случае, если вы действительно находитесь в .git
каталоге репозитория. Я не думаю, что OP этого ищет.
--is-inside-work-tree
ни другое не --is-inside-git-dir
будет работать, когда вы находитесь вне репозитория git. см. groups.google.com/forum/#!topic/git-users/dWc23LFhWxE
.git
. Для надежности опустите [ -d .git ]
и просто используйте git rev-parse ...
.
Ты можешь использовать:
git rev-parse --is-inside-work-tree
Что напечатает «истина», если вы находитесь в рабочем дереве репозиториев git.
Обратите внимание, что он по-прежнему возвращает вывод в STDERR, если вы находитесь за пределами репозитория git (и не печатает false).
Взято из этого ответа: https://stackoverflow.com/a/2044714/12983
git rev-parse --show-toplevel
соответствует ли подпапка, которую я проверяю,
Используйте git rev-parse --git-dir
если git rev-parse --git-dir> / dev / null 2> & 1; тогда : # Это действующий репозиторий git (но текущий рабочий # каталог не может быть верхнего уровня. # Проверьте вывод команды git rev-parse, если вам интересно) еще : # это не репозиторий git фи
Или вы можете сделать это:
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
На основе ответа @Alex Cory :
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
не содержит лишних операций и работает в -e
режиме.
git rev-parse
успешность, игнорируя его вывод.
git
команды действительны только внутри рабочего дерева. Таким образом, для написания сценариев вам, скорее всего, будет интересно находиться не просто внутри «репозитория git», а внутри рабочего дерева.[
. Просто делайте if git rev-parse --is-inside-work-tree; then ...
(с перенаправлением по желанию)
Другое решение - проверить код выхода команды.
git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1
Это напечатает 1, если вы находитесь в папке репозитория git.
.git
каталога, что может вам понадобиться, а может и нет.
git rev-parse 2>&-
.
Этот ответ предоставляет образец функции оболочки POSIX и пример использования, дополняющий ответ @ jabbie .
is_inside_git_repo() {
git rev-parse --is-inside-work-tree >/dev/null 2>&1
}
git
возвращает errorlevel, 0
если он находится внутри репозитория git, иначе он возвращает errorlevel 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
.git
получится, но распечатать false
.
git rev-parse --is-inside-work-tree
возвращается, true
или false
тогда он находится внутри репозитория git, и это то, что возвращает функция. то есть функция правильная
это работает для меня. Вы по-прежнему получаете ошибки, но их достаточно легко подавить. он также работает из подпапок!
git status> / dev / null 2> & 1 && echo Hello World!
Вы можете поместить это в оператор if then, если вам нужно условно сделать больше.
git status
может быть очень медленным на большом / старом репо. Я бы не стал использовать его для этой цели.
# проверяем, есть ли 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
[
. Просто сделайте:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
Почему бы не использовать коды выхода? Если мерзавец хранилище существует в текущем каталоге, а затем git branch
и git tag
команды возвращают код выхода на 0; в противном случае будет возвращен ненулевой код выхода. Таким образом, вы можете определить, существует ли репозиторий git или нет. Просто вы можете запустить:
git tag > /dev/null 2>&1 && [ $? -eq 0 ]
Преимущество : Flexibe. Он работает как с голыми, так и с обычными репозиториями, а также с sh, zsh и bash.
git tag
: Получение тегов репозитория, чтобы определить, существует он или нет.> /dev/null 2>&1
: Предотвращение печати чего-либо, включая нормальный вывод и вывод ошибок.[ $? -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
if ! [[ $(pwd) = *.git/* || $(pwd) = *.git ]]; then
if type -P git >/dev/null; then
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
printf '\n%s\n\n' "GIT repository detected." && git status
}
fi
fi
Спасибо ivan_pozdeev , теперь у меня есть тест, если внутри каталога .git код не запускается, поэтому ошибки не распечатываются или статус ложного выхода.
Команда " ! [[$ (Pwd) = .git / || $ (pwd) = * .git]] " проверяет, не находитесь ли вы внутри репозитория .git, тогда он выполнит команду git. Команда встроенного типа используется для проверки того, установлен ли у вас git или он находится в вашем PATH. см. тип помощи
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
printf '%s\n\n' "GIT repository detected." && git status
}
! отрицает, поэтому даже если вы запустите это в каталоге, который не является репозиторием git, он не даст вам фатальных ошибок
> / DEV / нуль 2> & 1 отправляет сообщения / DEV / нуль , так как вы только после того, как статус выхода. {} Предназначены для командных группировок так что все команды после того , как || запустится, если git rev-parse завершился успешно, поскольку мы используем! что отменяет статус выхода git rev-parse. Printf просто напечатать некоторые сообщения и GIT статус для печати статус репо.
Оберните его в функцию или поместите в сценарий. Надеюсь это поможет
.git
все получится, но распечатать false
.