Я пишу серию скриптов для управления 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.