شرح - ماهو git




Git/Bash بطيء للغاية في Windows 7 x64 (14)

أعلم أن هذا أمر قديم ، لكني كنت أواجه نفس المشكلة ، في كل من جيت باش وجيت غوي. كلا البرنامجين يستخدمان بشكل جيد ، لكنهما تباطأ بشكل عشوائي إلى الزحف ، ولم أتمكن من معرفة السبب. كما تبين ، كان أفاست. لقد تسبب أفاست في حدوث أشياء غريبة لمختلف البرامج (بما في ذلك البرامج التي أكتبها) ، لذا فقد قمت بتعطيلها لثانية واحدة ، ومن المؤكد أن باش يعمل بسرعة كبيرة كما هو الحال في لينكس. لقد قمت للتو بإضافة مجلد ملفات برنامج Git (C: \ Program Files \ Git) إلى قائمة استبعاد Avast ، وهو يعمل الآن بسرعة كما هو الحال في Linux.

ونعم ، أدركت أن Anti-Virus لم تكن هي المشكلة في المنشور الأصلي ، لكنني سأضع هذا هنا فقط في حالة أنه مفيد لشخص ما.

لقد كنت أستخدم Git على كل من Windows و Ubuntu أثناء تطوير مشروع صغير ، كثيرًا ما تتقلب بين الاثنين. المشكلة التي أواجهها هي أن Git / Bash أصبحت بطيئة باستمرار. عندما أقول بطئًا ، أعني أن تشغيل cd يستغرق من 8 إلى 25 ثانية ، بينما تستغرق أوامر git من 5 إلى 20 ثانية ، ويمكن أن يستغرق الأمر ls 30 ثانية في بعض الأحيان. وغني عن القول ، هذا ليس متعة ، ناهيك عن عدم إنتاجية. أعرف أن Git أبطأ على Windows ، ولكن هذا أمر مثير للسخرية.

الحل الوحيد الذي نجح - بشكل مؤقت - بالنسبة لي هو تعطيل اتصال الشبكة (كما هو موضح في هذه الإجابة ) ، وبدء git ، ثم إعادة الاتصال. في بعض الأحيان يستمر تشغيله بسرعة لأيام بعد القيام بذلك ، ولكن الأداء يتدهور دائمًا في النهاية. لقد قمت بالبحث من خلال مجموعة مناقشة msysgit ، قائمة SO ، msysgit ، وما إلى ذلك وإيقافها لأسابيع ، لكنني لم أتمكن من عرض الحلول التي تعمل.

لقد حاولت حتى الآن:

  • إضافة git & project folders إلى قائمة استبعاد برنامج مكافحة الفيروسات
  • تعطيل برنامج مكافحة الفيروسات الخاص بي بالكامل (Kaspersky IS 2011)
  • التأكد من عدم تشغيل Outlook (Outlook 2007)
  • اغلاق جميع التطبيقات الأخرى
  • تشغيل بوابة كمسؤول
  • تعطيل اتصال الشبكة ، وبدء تشغيل بوابة ، والحفاظ على تعطيل الاتصال
  • تعطيل اتصال الشبكة ، بدء git ، إعادة تمكين الاتصال (يعمل فقط من حين لآخر)
  • تشغيل بوابة gc
  • ومجموعات من ما سبق

قرأت أن شخصين نجحا في تعطيل عملية bash ، ولكن من الناحية المثالية ، أود الحفاظ على هذا النشاط. إصدار msysgit هو 1.7.3.1-preview20101002 & نظام التشغيل هو Windows 7 x64. إن تشغيل الأشياء نفسها على نظام Linux أمر متوقع بسرعة البرق. أستخدم لينكس حصريًا ، لكني بحاجة إلى تشغيل أشياء في Windows أيضًا (تطبيقات معينة ، واختبار ، وما إلى ذلك).

هل واجه أي شخص مشكلة مماثلة؟ إذا كان الأمر كذلك ، فما هي المشكلة الأساسية وما هو الحل (إن وجد)؟

تحرير: هذا يمتد إلى ما هو أبعد من مستودعات git ، ولكن فقط للإشارة ، فإن عمليات إعادة الشراء التي استخدمتها بوابة كانت صغيرة جدًا: ~ 4-50 ملفات كحد أقصى.


أنا حل مشكلتي جيت بطيئة على فوز 7 إلى x64 عن طريق بدء cmd.exe مع "تشغيل كمسؤول".


إذا كنت تستخدم Git من cmd ، فجرّب تشغيله من Git Bash. في cmd ، git.exe في الواقع عبارة عن غلاف يقوم بإعداد البيئة الصحيحة في كل مرة تقوم فيها بتشغيله ، وعندئذ فقط يقوم بتشغيل git.exe الحقيقي. يمكن أن يستغرق الأمر ما يصل إلى ضعف الوقت اللازم للقيام بما تريده. و Git Bash يهيئ البيئة فقط عندما يبدأ.


الإجابات المشتركة:

  1. Wilbert's - ما هي المعلومات التي يجب تضمينها في PS1
  2. sinelaw's - (<branch_name>) أو (<sha>)
# https://unix.stackexchange.com/questions/140610/using-variables-to-store-terminal-color-codes-for-ps1/140618#140618
# https://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-ps1-prompt
# \033 is the same as \e
# 0;32 is the same as 32
CYAN="$(echo -e "\e[1;36m")"
GREEN="$(echo -e "\e[32m")"
YELLOW="$(echo -e "\e[33m")"
RESET="$(echo -e "\e[0m")"

# https://.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# https://.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# https://.com/questions/39518124/check-if-directory-is-git-repository-without-having-to-cd-into-it/39518382#39518382
fast_git_ps1 ()
{
    git -C . rev-parse 2>/dev/null && echo " ($((git symbolic-ref --short -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null))"
}

# you need \] at the end for colors
# Don't set \[ at the beginning or ctrl+up for history will work strangely
PS1='${GREEN}\[email protected]\h ${YELLOW}\w${CYAN}$(fast_git_ps1)${RESET}\] $ '

نتيجة:



على الرغم من أن المشكلة قد تكون قائمة على الشبكة ، فقد قمت أنا شخصيا بتسريع مكالمات git status المحلية عشرة أضعاف (+ 7 ثوان إلى 700 مللي ثانية) عن طريق إجراء تعديلين. هذا على repo 700mb مع 21،000 الملفات والأعداد الزائدة من الملفات الثنائية الكبيرة.

واحد هو تمكين التحميل المسبق للمؤشرات الموازية. من موجه الأوامر:
git config core.preloadindex true
تم تغيير time git status من 7 ثوانٍ إلى 2.5 ثانية.

تحديث!

ما يلي لم يعد ضروريا. تم إصلاح هذا التصحيح اعتبارًا من mysysgit 1.9.4
https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988
ومع ذلك ، يجب تمكين الإصلاح بكتابة
git config core.fscache true

أنا أيضا تعطيل UAC و سائق "luafv" (إعادة التشغيل المطلوبة). يؤدي ذلك إلى تعطيل برنامج التشغيل في windows vista 7 و 8 الذي يعيد توجيه البرامج التي تحاول الكتابة إلى مواقع النظام ويقوم بدلاً من ذلك بإعادة توجيه عمليات الوصول هذه إلى دليل المستخدم.

للاطلاع على مناقشة حول كيفية تأثير هذه الأداة على أداء git ، اقرأ هنا: https://code.google.com/p/msysgit/issues/detail?id=320

لتعطيل برنامج التشغيل هذا ، في regedit ، قم بتغيير المفتاح "start" في HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv إلى 4 لتعطيل برنامج التشغيل. بعد ذلك ، ضع UAC على أقل إعداد لها ، "لا تخطر أبدا".

إذا كان تعطيل برنامج التشغيل هذا يجعلك حذرًا (يجب) ، فسيتم تشغيل بديل على محرك أقراص (أو قسم) مختلف عن قسم النظام لديك. على ما يبدو السائق يعمل فقط على الوصول إلى الملفات على قسم النظام. لدي محرك أقراص ثابت آخر ورؤية نتائج متطابقة عند تشغيله مع هذا التعديل في التسجيل على محرك الأقراص C الخاص بي كما أفعل دون ذلك على محرك الأقراص D.

يستغرق هذا التغيير وقتًا time git status من 2.5 ثانية إلى 0.7 ثانية.

قد ترغب أيضًا في اتباع https://github.com/msysgit/git/pull/94 و https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b للتحقق من العمل الإضافي الجاري لحل مشكلات السرعة في Windows .


في حالتي ، تم تعيين اختصار git bash Start in:%HOMEDRIVE%%HOMEPATH% (يمكنك التحقق من ذلك بالنقر بزر الماوس الأيمن على git bash وتحديد الخصائص). كان هذا هو محرك الشبكة.

الحل هو جعله يشير إلى %HOME% . إذا لم يكن لديك ، يمكنك إعداده في متغيرات البيئة ، والآن يجب أن يكون git bash سريعًا.


في حالتي ، في الواقع كان برنامج مكافحة الفيروسات أفاست مما أدى إلى gitter باش وحتى تصبح Powershell بطيئة حقا.

حاولت أولاً تعطيل Avast لمدة 10 دقائق لمعرفة ما إذا كانت قد تحسنت السرعة وفعلت ذلك. بعد ذلك ، أضفت دليل تثبيت Git Bash بأكمله كإستثناء في Avast ، للقراءة والكتابة والتنفيذ. في حالتي كان C:\Program Files\Git\* .


كان لدي أيضا مشكلة مع git PS1 البطء ، altough لفترة طويلة كنت أفكر أنها مشكلة حجم ديسيبل (ريبو كبيرة) ، وكان يحاول git الثلاثي git مختلفة ، وكانت تبحث عن أسباب أخرى ، مثلك تماما. ومع ذلك ، في حالتي ، كانت المشكلة في هذا الخط:

function ps1_gitify
{
   status=$(git status 2>/dev/null )      # <--------------------
   if [[ $status =~ "fatal: Not a git repository" ]]
   then
       echo ""
   else
       echo "$(ps1_git_branch_name)  $(ps1_git_get_sha)"
  fi
}

فما كان بطيئًا هو القيام بحالة git لكل سطر حالة سطر الأوامر. أوتش. كان شيئًا كتبته باليد. رأيت أن هناك مشكلة عندما حاولت

export PS1='$'

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

الآن أنا أستخدم هذا:

function we_are_in_git_work_tree 
{
    git rev-parse --is-inside-work-tree &> /dev/null
}

function ps1_gitify
{
    if ! we_are_in_git_work_tree
    then
    ...

من هذا SO https://.com/a/11975827/2492808 وأنه يعمل بشكل جيد. مرة أخرى لديها خط قيادة بوابة سريع.


كما هو مذكور في إجابات Chris Dolan's و Wilbert ، يبطئك PS1 .

بدلا من تعطيل تماما (كما اقترح من دولان) أو باستخدام البرنامج النصي الذي قدمه Wilbert ، يمكنني استخدام "PS1 غبي" الذي هو أسرع من ذلك بكثير.

يستخدم (git symbolic-ref -q HEAD || git rev-parse --short HEAD) 2> /dev/null :

PS1='\033[33m\]\w \n\[\033[32m\]$((git symbolic-ref -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null) \[\033[00m\]# '

على cygwin الخاص بي ، هذا أسرع من إجابة Wilbert's "fast_git_ps1" - 200ms مقابل 400ms ، لذلك تحلق قليلاً من تباطؤك الفوري.

إنه ليس متطورًا مثل __git_ps1 - على سبيل المثال ، لا يغير __git_ps1 عند __git_ps1 ، إلخ. ولكن للاستخدام اليومي العادي فهو جيد بما يكفي وسريع.

تم اختباره على بوابة 1.7.9 (cygwin ، ولكن يجب أن يعمل على أي منصة)


لقد واجهت نفس المشكلة في تشغيل git لـ Windows (msysgit) على Windows 7 x64 كحساب مستخدم محدود لبعض الوقت. من ما قرأت هنا وأماكن أخرى ، يبدو أن الموضوع المشترك هو عدم وجود امتيازات إدارية و / أو UAC. منذ إيقاف تشغيل UAC على النظام الخاص بي ، فإن الشرح الذي يحاول كتابة / حذف شيء ما في دليل ملفات البرنامج يجعل الأمر أكثر منطقية بالنسبة لي.

في أي حال ، لقد حل مشكلتي عن طريق تثبيت النسخة المحمولة من بوابة 1.8 مع zipinstaller. لاحظ أن اضطررت إلى فك ملف التوزيع .7z وقم بإعادة شرائه كرسالة من أجل عمل zipinstaller. واضطررت أيضًا إلى إضافة هذا الدليل يدويًا إلى مسار النظام الخاص بي.

الأداء على ما يرام الآن. على الرغم من أنه مثبت في دليل ملفات البرامج (x86) ، الذي ليس لدي أذونات كمستخدم محدود ، فإنه لا يبدو أنه يعاني من نفس المشكلة. أعزو هذا إلى حقيقة أن النسخة المحمولة أكثر محافظة قليلاً في المكان الذي يكتب فيه / يحذف الملفات ، وهو على الأرجح الحالة ، أو الترقية من 1.7 إلى 1.8. لن أحاول تحديد أي سبب ، يكفي القول بأنه يعمل بشكل أفضل الآن ، بما في ذلك باش.


لقد وجدت محرك الشبكة هو مشكلة الأداء. كان HOME يشير إلى مشاركة شبكة بطيئة. لم أتمكن من تجاوز HOMEDRIVE ولكن هذا ليس مشكلة من ما رأيته.

قم بتعيين متغير البيئة من خلال النقر بزر الماوس الأيمن على جهاز الكمبيوتر الخاص بك على سطح المكتب -> الخصائص -> إعدادات النظام المتقدمة -> متغيرات البيئة أضف إلى قسم متغيرات المستخدم

HOME=%USERPROFILE%

يبدو أن إلغاء تثبيت Git تمامًا وإعادة تشغيله (معالجة Windows التقليدية) وإعادة تثبيت Git كان العلاج. أنا أيضا مسحت جميع ملفات التكوين باش التي خلفها (تم إنشاؤها يدويا). كل شيء سريع مرة أخرى.

إذا كان إعادة التثبيت غير ممكن (أو مطلوبًا) لسبب ما ، فأنا أحاول بالتأكيد تغيير متغير PS1 المشار إليه في إجابة كريس دولان . أسفرت عن عمليات تسريع كبيرة في عمليات معينة.


يمكنك تسريع git على Windows بشكل ملحوظ عن طريق تشغيل ثلاثة أوامر لتعيين بعض خيارات التكوين:

$ git config --global core.preloadindex true
$ git config --global core.fscache true
$ git config --global gc.auto 256

ملاحظات:

  • core.preloadindex يقوم بعمليات نظام الملفات بشكل متوازي لإخفاء زمن الانتقال (التحديث: core.preloadindex بشكل افتراضي في git 2.1)

  • core.fscache بإصلاح مشاكل UAC بحيث لا تحتاج إلى تشغيل git كمسؤول (التحديث: ممكّن بشكل افتراضي في Git لـ Windows 2.8)

  • gc.auto يحد من عدد الملفات في .git /







mingw32