it-swarm.asia

Git Bash بطيء للغاية على نظام التشغيل Windows 7 x64

لقد كنت أستخدم Git على كل من Windows و Ubuntu أثناء تطوير مشروع صغير ، وغالبًا ما يتم التقليب بين الجانبين. المشكلة هي أن Git Bash تصبح بطيئة باستمرار.

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

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

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

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

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

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

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

394
Gemini14

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

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

16
Gemini14

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

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

ملاحظات:

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

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

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

386
shoelzer

هل لديك معلومات Git تظهر في موجه Bash؟ إذا كان الأمر كذلك ، ربما كنت تفعل عن غير قصد طريقة الكثير من العمل على كل أمر. لاختبار هذه النظرية جرب التغيير المؤقت التالي في Bash:

export PS1='$'
88
Chris Dolan

دليل Windows المنزلي الخاص بي موجود على الشبكة ، وأظن أن أوامر Git Bash كانت تبحث هناك أولاً. من المؤكد ، عندما نظرت إلى PATH $ ، أدرجت/h/bin أولاً ، حيث/h هي مشاركة على خادم ملفات Windows ، على الرغم من أن/h/bin غير موجود. لقد قمت بتحرير/etc/profile وعلقت على أمر التصدير الذي يضعه أولاً في PATH $:

#export PATH="$HOME/bin:$PATH"

هذا جعل أوامري تعمل بشكل أسرع كثيرًا ، ربما لأن Git Bash لم يعد يبحث عبر الشبكة عن الملفات التنفيذية. ملفي/etc/profile كان c:\Program Files (x86)\Git\etc\profile.

75
Rob Johnson

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

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

HOME=%USERPROFILE%
35
MichaelK

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

واحد هو تمكين التحميل المسبق مؤشر متوازي. من موجه الأوامر:

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

لتعطيل برنامج التشغيل هذا ، في رجديت ، قم بتغيير مفتاح "البدء" في 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.

22
Jeff Lamb

امتدادًا لإجابة Chris Dolan ، استخدمت الإعداد البديل PS1 التالي. ما عليك سوى إضافة جزء الشفرة إلى ملف التعريف ~/.profile الخاص بك (على Windows 7: C: /Users/USERNAME/.profile).

fast_git_ps1 ()
{
    printf -- "$(git branch 2>/dev/null | sed -ne '/^\* / s/^\* \(.*\)/ [\1] / p')"
}

PS1='\[\033]0;$MSYSTEM:\w\007
\033[32m\]\[email protected]\h \[\033[33m\w$(fast_git_ps1)\033[0m\]
$ '

يحافظ هذا على ميزة وجود Shell ملون وعرض اسم الفرع الحالي (إذا كان في مستودع Git) ، إلا أنه أسرع بشكل كبير على الجهاز الخاص بي ، من حوالي 0.75 ثانية إلى 0.1 ثانية.

هذا يعتمد على هذا بلوق وظيفة .

21
Wilbert

لقد قمت بحل مشكلتي Git البطيئة على نظام التشغيل Windows 7 x64 من خلال بدء تشغيل cmd.exe باستخدام "Run as administrator".

11
Chris Pawlukowsky

لقد رأيت تحسنًا لائقًا عن طريق تعيين core.preloadindex على صحيحًا كما هو موصى به هنا .

8
Andy

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

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

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

5
Nkosi Dean

كما لوحظ في إجابات كريس دولان وويلبرت ، PS1 يبطئك .

بدلاً من التعطيل الكامل (كما اقترح Dolan) أو باستخدام البرنامج النصي الذي يقدمه 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 "fast_Git_PS1" - 200 مللي ثانية مقابل 400 مللي ثانية ، لذلك فهو يزيل قليلاً من تباطؤك الفوري.

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

تم اختبار هذا على Git 1.7.9 (Cygwin ، لكن يجب أن يعمل على أي نظام أساسي).

5
sinelaw

قد تحصل أيضًا على زيادة أداء ضعيفة جدًا عن طريق تغيير تكوين Git التالي:

git config --global status.submoduleSummary false

عند تشغيل الأمر git status البسيط على Window 7 x64 ، استغرق تشغيل الكمبيوتر أكثر من 30 ثانية. بعد تحديد هذا الخيار ، يكون الأمر فوريًا.

ساعدني تنشيط تتبع Git كما هو موضح في الصفحة التالية في العثور على أصل المشكلة ، والذي قد يختلف في التثبيت الخاص بك: https://github.com/msysgit/msysgit/wiki/Dagnagnet-why-Git-is- بطيء جدا

4
Olivier

بالإضافة إلى هذه الإجابات الأخرى ، قمت بتسريع المشاريع باستخدام وحدات فرعية متعددة باستخدام جلب وحدة فرعية متوازية (منذ Git 2.8 في أوائل عام 2016).

يمكن القيام بذلك باستخدام git fetch --recurse-submodules -j8 وتعيينه مع git config --global submodule.fetchJobs 8 ، أو مع ذلك العديد من النوى لديك/تريد استخدامها.

3
codehearts

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

2
Eugene Pakhomov

في حالتي ، كان برنامج مكافحة الفيروسات Avast هو الذي أدى بالفعل إلى Git Bash وحتى أصبح PowerShell بطيئًا بالفعل.

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

2
Mastergalen

لقد واجهت نفس المشكلة في تشغيل Git for Windows (msysgit) على Windows 7 إلى x64 كحساب مستخدم محدود لبعض الوقت.

من ما قرأته هنا وأماكن أخرى ، يبدو أن السمة المشتركة هي عدم وجود امتيازات إدارية و/أو UAC. نظرًا لأن UAC مطفأ على نظامي ، فإن التفسير الذي يحاول فيه كتابة/حذف شيء ما في دليل ملفات البرنامج يجعله أكثر منطقية بالنسبة لي.

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

الأداء على ما يرام الآن. على الرغم من تثبيته في دليل Program Files (x86) ، الذي ليس لدي أذونات كمستخدم محدود ، إلا أنه لا يبدو أنه يعاني من نفس المشكلة.

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

2
Binary Phile

الإجابات المدمجة:

  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://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# https://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# https://stackoverflow.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}\] $ '

نتيجة:

 frolowr@RWAMW36650 /c/projects/Elm-math-kids (master) $ 

2
rofrol

ساعدني فقط إيقاف تشغيل AMD Radeon Graphics (أو Intel Graphics) في إدارة الأجهزة.

 enter image description here 

لقد وجدت الإجابة هنا: https://superuser.com/questions/1160349/git-is-extremely-slow-on-windows# =

2
Alexander Trofimov

لا شيء مما سبق كان قادرا على مساعدتي. في السيناريو الخاص بي ، كانت المشكلة تظهر كالتالي:

  • أي أمر ll كان بطيئًا (استغرق تنفيذ حوالي 3 ثوانٍ)
  • تم تنفيذ أي أمر ll لاحقًا على الفور ، ولكن فقط إذا كان في غضون 45 ثانية من الأمر ls السابق .

عندما يتعلق الأمر بالتصحيح مع Process Monitor وجد أنه قبل كل أمر كان هناك طلب DNS.

بمجرد أن قمت بتعطيل جدار الحماية الخاص بي (كمودو في حالتي) وترك الأمر ينفذ المشكلة. ولن يعود مرة أخرى عندما تم تشغيل جدار الحماية مرة أخرى. مع أول فرصة ، سوف أقوم بتحديث هذا الرد بمزيد من التفاصيل حول العملية التي كانت تقوم بها بطلب DNS للحظر وما هو الهدف.

BR، G

1
George

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

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

0
mahacoder

واجه أحد زملائي في العمل مشاكل مع Git على Windows (7) git statuscheckout و add كانت سريعة ، ولكن git commit استغرق الأعمار.

ما زلنا نحاول العثور على السبب الجذري لذلك ، لكن استنساخ المستودع في مجلد جديد أدى إلى إصلاح مشكلته.

0
mrcl

كما قال الكثيرون ، يرجع ذلك إلى stash كونه برنامج نصي من Shell على Windows ، ولكن منذ Git 2.18.0 ، يمتلك مثبت Windows خيارًا لميزة تجريبية لإصدار مدمج أسرع بكثير (حوالي 90٪) من النسخة المخبأة - https://github.com/git-for-windows/build-extra/pull/203 .

0
bergmeister

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

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 status لكل سطر حالة لسطر الأوامر بطيئًا. أوتش. كان شيئا كتبته باليد. رأيت أن هذه مشكلة عندما جربت

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
    ...

من خط نشر Stack OverflowPS1 مع فرع وألواح git الحاليةويعمل بشكل جيد. مرة أخرى يكون لديك سطر أوامر Git سريع.

0
Koshmaar