2009-07-15 3 views
3

Этот вопрос основан на the thread.Чтобы получить Git-prompt работу в Zsh без ошибки в функции

У меня есть следующее Git-prompt на данный момент. После получения 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-приглашение в 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%}' 

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

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

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

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

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

ответ

2

Использование

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

или

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

Выход рано.

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

+0

Что означают 'REL' и' BR'? --- Являются ли эти имена встроенными в Git? –

+0

Я получаю то же сообщение об ошибке, что и с кодом * seth *. Это говорит о том, что проблема все еще находится в функции * get_git_dirty *. --- В моем приглашении нет имени филиала с вашим кодом. Он показывает только звезду, указывающую, что вам нужно «git-add» и «git-commit». –

+1

REL и BR - переменные, используемые в оперативном коде для каталога RELative в проекте, и текущий BRanch. Важной частью является выход из git-специфической части, когда git-symbolic-ref или git-rev-parse возвращают ненулевой код; git-diff не может использоваться таким образом, потому что ненулевой выход используется для чего-то другого. –

1

Будет что-то вроде этой работы?


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

Я получаю следующие сообщения об ошибках с вашим кодом 'fatal: не репозиторий git (или любой из родительских каталогов): .git fatal: не репозиторий git (или любой из родительских каталогов): .git'. –

+0

Это исправит второй.Вам нужно будет сделать что-то подобное, чтобы исправить второй. Вы можете добавить третью функцию, которая в основном используется для определения, есть ли у вас каталог .git, а затем вызывать его перед вызовом git. – Mark

+0

@Mark: Ваша функция решает ошибку в git-diff. --- Мне трудно читать ваши функции. Что такое '__MT_OK__'? –

2

На самом деле, я думаю, что это первый, который вызывает ошибку, потому что, когда я запускаю его в директории, отличной от 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, вероятно, все равно проходит обход каталога. Не уверен.

+0

Я все еще вижу 'get_git_dirty', похоже, тоже проблема, так как я получаю следующее сообщение об ошибке с вашим кодом:' fatal: git diff [--no-index] принимает два пути: fatal: git diff [--no- index] принимает два пути. –

+0

У вас есть что-то в ваших псевдонимах или .gitrc, которые проходят --no-index для git diff? Я получаю эту ошибку, когда я вызываю 'git diff --no-index' – seth

+0

И под .gitrc Я имею в виду .gitconfig – seth

0

Я получаю этот код, наконец, работать:

# 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 "[email protected]" ; exit ; } 
    echo $BR 
} 

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

+0

Пожалуйста, обратите внимание, что ответ Марка решает вторую ошибку с git-diff по адресу http://stackoverflow.com/questions/1132725/to-get-git-prompt-work-in-zsh -без-а-ошибка-в-функции/1132837 # 1132837 –

 Смежные вопросы

  • Нет связанных вопросов^_^