للحصول على عمل GIT موجه في ZSH دون علة في وظيفة

StackOverflow https://stackoverflow.com/questions/1132725

  •  16-09-2019
  •  | 
  •  

سؤال

ويستند هذا السؤال الخيط.

لدي موجه GIT التالي في الوقت الحالي. أحصل على التحذير التالي بعد cdجي إلى مجلد غير جيت.

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                                                   
   }

كيف يمكنك التخلص من رسائل التحذير للحصول على الدلائل غير الجيت؟

هل كانت مفيدة؟

المحلول

يستخدم

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)

نصائح أخرى

في الواقع، أعتقد أنه أول واحد يسبب الخطأ لأنه عندما أقوم بتشغيله في دليل غير جيت، أحصل على الأخطاء. والثاني لا يبصق الأخطاء.

يمكنك إعادة توجيه إخراج الخطأ إلى /dev/null.

هذا سيعمل في باش، لست متأكدا من 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 ربما يفعل دليل اجتياز على أي حال. غير متأكد.

هل شيء مثل هذا العمل؟


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
}

قد لا يكون هذا هو الحل الأكثر أناقة، لكن يجب أن يعمل.

أحصل على هذا الرمز أخيرا للعمل:

 # 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
 }

بينما الباقي هو نفسه كما كان من قبل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top