Чтобы заставить работать Git-подсказку в Zsh без ошибки в функции - PullRequest
3 голосов
/ 15 июля 2009

Этот вопрос основан на теме .

В данный момент у меня есть следующая Git-подсказка. После cd я получаю следующее предупреждение в папку, не относящуюся к Git.

fatal: Not a git repository (or any of the parent directories): .git                   
fatal: git diff [--no-index] takes two paths
fatal: Not a git repository (or any of the parent directories): .git
fatal: git diff [--no-index] takes two paths

Мой текущий код для Git-prompt в Zsh

 # get the name of the branch we are on
 git_prompt_info() {
     ref=$(git symbolic-ref HEAD | cut -d'/' -f3)
     echo $ref
 }
 get_git_dirty() {
   git diff --quiet || echo '*'                                                   
 }
 autoload -U colors
 colors
 setopt prompt_subst
 PROMPT='%{$fg[blue]%}%c %{$fg_bold[red]%}$(git_prompt_info)$(get_git_dirty)%{$fg[blue]%} $ %{$reset_color%}'

Проблема заключается в следующем коде, который вызывает предупреждение для не-Git папок

get_git_dirty() {
       git diff --quiet || echo '*'                                                   
     }

Я попытался устранить ошибку, перенаправив ошибки в / tmp / безуспешно, так что

  get_git_dirty() {
           git diff --quiet 2>/tmp/error || echo '*' 2>/tmp/error                                                   
   }

Как избавиться от предупреждающих сообщений для не-git каталогов?

Ответы [ 4 ]

2 голосов
/ 15 июля 2009

На самом деле, я думаю, что это первый, который вызывает ошибку, потому что, когда я запускаю его в не-git каталоге, я получаю ошибки. Второй не выкладывает ошибки.

Вы можете перенаправить вывод ошибки на /dev/null.

Это сработает в bash, не уверен насчет zsh, но оно должно дать вам представление о том, как идти.

git_prompt_info() {
    ref=$(git symbolic-ref HEAD 2>/dev/null)
    if [ ! -z $ref ]; then
        newref=$(echo $ref | cut -d'/' -f3)
        echo $newref
    fi
}

Я не знаю, что будет дороже, если запустить git или просмотреть все каталоги, пока вы не найдете каталог .git. Git, вероятно, выполняет обход каталога в любом случае. Не уверен.

2 голосов
/ 16 июля 2009

Используйте

REL=$(git rev-parse --show-prefix 2>/dev/null) || { echo "$@" ; exit ; }

или

BR=$(git symbolic-ref HEAD 2>/dev/null) || { echo "$@" ; exit ; }

Выйти рано.

Чтобы быть более точным: вы не можете использовать состояние выхода git diff --quiet, чтобы проверить, находитесь ли вы в рабочем хранилище, потому что git diff затем «завершается с 1, если были различия, и 0 означает, что нет различий». (см. git-diff manpage)

1 голос
/ 15 июля 2009

Хотелось бы что-нибудь подобное?


get_git_dirty() {
set __MT_OK__=0

if [[ -d .git ]]; then
    __MT_OK__=1
fi

while [[ ! -d .git ]]; do
    cd ..
    if [[ -d .git ]]; then
        __MT_OK__=1
        break
    fi
    if [[ $PWD = "/" ]]; then
        break
    fi
done



if [[ __MT_OK__ -eq 1 ]]; then
           git diff --quiet || echo '*'                                                    
fi
}

Возможно, это не самое элегантное решение, но оно должно работать.

0 голосов
/ 16 июля 2009

Я наконец-то заработал этот код:

 # get the name of the branch we are on
 git_prompt_info() {
     BR=$(git symbolic-ref HEAD 2>/dev/null | awk -F/ '{ print $3 }') || { echo "$@" ; exit ; }
     echo $BR
 }

, а остальные такие же, как и раньше.

...