विंडोज में मैगिट बेहद धीमा। मैं कैसे अनुकूलित करूं?


15

मैं एक परियोजना के लिए विंडोज 10 का उपयोग करने के लिए मजबूर हूं। हां, मैं ग्नू / लिनक्स का उपयोग करूंगा। अपनी पवित्रता बनाए रखने के लिए, मैंने विंडोज को Emacs के लिए एक बूटलोडर के रूप में सम्मान देने की कोशिश की है :)

दुर्भाग्य से, मैगिट (एमएसीएस के मेरे पसंदीदा हिस्सों में से एक, जो विंडोज पर एक अच्छी कमांड लाइन की कमी के लिए भी बनाता है) असहनीय रूप से धीमा है। मेरे पास एक एसएसडी, 16 जीबी रैम और एक क्वाड-कोर आई 7 है लेकिन एक छोटे से भंडार पर निष्पादित होने में आठ सेकंड लगते हैं magit-status। फिर, जब मैं किसी अन्य परिवर्तन को चरणबद्ध करना चाहता हूं, तो इसे प्रति फ़ाइल लगभग 5 सेकंड लगते हैं ।

यहाँ मैंने कोशिश की है:

  • $ git config --global core.preloadindex true
  • $ git config --global core.fscache true
  • $ git config --global gc.auto 256
  • विंडोज डिफेंडर (मेरी एकमात्र AV) अपवर्जन सूची में पूरी परियोजना को जोड़ना
  • magit-git-executableमेरे द्वारा डाउनलोड किए गए नियमित msysgit पर सेट करना ( https://git-for-windows.github.io/ )। मैंने जाँच की और git statusयहाँ 1 सेकंड लगता है। मुझे पता है कि magit-statusअधिक रास्ता है, लेकिन यह बहुत अधिक है।

किसी को भी यह तेजी से बनाने के तरीके सुझा सकते हैं? मैं इस तरह से विंडोज पर मैगिट का उपयोग करने की किसी को कल्पना नहीं कर सकता।

यह सुझाव दिया गया था कि यह प्रश्न एक डुप्लिकेट है, लेकिन उन्होंने पूछा:

मैं यह समझने के लिए संघर्ष कर रहा हूं कि इमैक ने विंडोज की तुलना में उबंटू पर बहुत कम स्टार्टअप समय क्यों दिया है। किसी को जवाब पता है?

मुझे पता है कि कम से कम कुछ कारण क्यों Emacs, Git और Magit विंडोज पर धीमे हैं। मैं पूछ रहा हूं कि मैं मैगिट को कम चीजों, या कैश परिणामों, या कुछ और करने के लिए कैसे अनुकूलित करता हूं , भले ही यह कार्यक्षमता की कीमत पर हो।


git-status<1 सेकंड लगता है? यह अनिवार्य रूप से तात्कालिक होना चाहिए। वहाँ किसी भी बोधगम्य देरी है?
पाइथननॉट

क्या आपके पास gitकमांड लाइन से समान कमांड चलाने वाले समान मुद्दे हैं ?
एलेथन

मुझे लगता है कि मैगिट की डिफ़ॉल्ट पसंद magit-git-executableशायद थोड़ी तेज़ होगी (जो वास्तव में हैं cmdऔर binवे वास्तव में रैपर हैं, अगर executable-findउनमें से एक मैगिट magit-git-executable"वास्तविक" गिट में सेट करने का प्रयास करेगा )। एक छोटी रिपॉजिटरी ध्वनियों के लिए 8 सेकंड कुछ और गलत है, हालांकि, मैगिट के रेपो के लिए ~ 0.8s लेता है यहां (विंडोज 8)।
npostavs 16


1
इसके अलावा, एक और अधिक सटीक समय के लिए, आप सेट कर सकते हैं magit-refresh-verboseकरने के लिए t
नानी

जवाबों:


11

मैंने वास्तव में इस पर बहुत अधिक शोध किया है और मूलभूत रूप से समस्या यह है कि विंडोज़ बेकार है

यह अपस्ट्रीम बग है: https://github.com/git-for-windows/git/issues/596 और इसे सी में शेल स्क्रिप्ट को फिर से लिखने के लिए किसी की आवश्यकता होती है ताकि कोई और फोर्किंग न हो। मेरे लिए, इसका इंटरएक्टिव रिबेस जो असली हत्यारा है (मैं एक इंटरएक्टिव रिबास को किक कर सकता हूं, चाय बना सकता हूं, वापस आ सकता हूं, कुछ खबरें पढ़ सकता हूं, चाय पी सकता हूं और फिर शायद यह खत्म हो गया है। यह बहुत सारे लोगों की तुलना में बहुत खराब है। लगता है कि यह है), लेकिन सामान्य स्थिति जैसी कॉल भी काम को बाधित करने के लिए पर्याप्त हैं।

एक विकल्प हो सकता है कि मैगिट का उपयोग करने वाले आदेशों का समर्थन करने के लिए jGit को अपडेट करें और फिर JVM स्टार्टअप समय को कम करने के लिए इसे नेलगंज में चलाएं, मैंने इस पर चर्चा करने के लिए एक सूत्र शुरू किया: http://dev.eclipse.org/mhonarc/nists/ jgit-देव / msg03064.html

आप कुछ संभावित स्पीडअप के लिए /programming/4485059 पढ़ना चाह सकते हैं , लेकिन ईमानदारी से आप उन्हें मुश्किल से देख पाएंगे।

आप मैजिट में कुछ कर सकते हैं magit-status, मंचन के लिए कम से कम स्थापित करने में लेखक की सलाह का पालन करना है

;; WORKAROUND https://github.com/magit/magit/issues/2395
(define-derived-mode magit-staging-mode magit-status-mode "Magit staging"
  "Mode for showing staged and unstaged changes."
  :group 'magit-status)
(defun magit-staging-refresh-buffer ()
  (magit-insert-section (status)
    (magit-insert-untracked-files)
    (magit-insert-unstaged-changes)
    (magit-insert-staged-changes)))
(defun magit-staging ()
  (interactive)
  (magit-mode-setup #'magit-staging-mode))

तो, क्या आप किसी भी अनुभवी सी या जावा डेवलपर्स को जानते हैं जो गिट या जीजीटी को ठीक करने के लिए समाधानों में से किसी एक की मदद कर पाएंगे?


मुझे यकीन नहीं है कि समस्या शेल स्क्रिप्ट बनाम सी है, क्योंकि magit-statusवास्तव में लंबा समय लगता है, और मुझे नहीं लगता कि स्थिति शेल स्क्रिप्ट के कई उपयोग करती है।
नानी

1
और उस "न्यूनतम" magit-statusकोड के लिए धन्यवाद , यह मुझे थोड़ी मदद करने लगता है (यह मेरा magit-refreshसमय 2-3 सेकंड तक कम कर देता है)।
नानी

यह वही है जो मैं चाहता हूं। धन्यवाद!
हुत 8

1
हाँ, magit-stagingमेरे लिए भी कुछ सेकंड लगते हैं। मेरी सोच को बाधित करने के लिए पर्याप्त है, लेकिन मेरे दिन को नष्ट करने के लिए पर्याप्त नहीं है।
fommil

2
कारण है कि magit-statusधीमी है क्योंकि यह करने के लिए बाहर कॉल है gitशायद 10 या 20 बार। जीएनयू प्लेटफार्मों की तुलना में विंडोज पर नई प्रक्रियाएं शुरू करना बेहद धीमा है। शेल स्क्रिप्ट इस का एक चरम मामला है (क्योंकि बहुत ज्यादा हर कथन एक नई प्रक्रिया है)
fommil

2

हाल ही में एक और कारण call-processसे कॉलों की एक सूची को देखने के बाद magit-status, इसने मुझे बताया कि उनमें से कुछ को कैश किया जा सकता है। magit-statusमैगिट के रेपो पर निम्नलिखित सलाह के साथ 1.9 से 1.3 सेकंड तक चला जाता है (टिप्पणियों में वर्णित 0.8s का मेरा पिछला माप एक अलग (तेज) कंप्यूटर के लिए था)। यदि आप पहले magit-stagingसे ही दूसरे उत्तर का उपयोग कर रहे हैं, तो यह बहुत मदद करने वाला नहीं है: मैंने 0.16 से 0.12 सेकंड तक की कमी देखी (लेकिन यह माप शोर से बमुश्किल बड़ी है)।

चेतावनी: यह कैश को अपडेट करने का ध्यान नहीं रखता है, इसलिए चीजें गलत हो सकती हैं (विशेषकर यदि आप अपने जी-कॉन्फ़िगरेशन के साथ फ़िडलिंग कर रहे हैं)।

(defvar-local magit-git--git-dir-cache nil)
(defvar-local magit-git--toplevel-cache nil)
(defvar-local magit-git--cdup-cache nil)

(defun memoize-rev-parse (fun &rest args)
  (pcase (car args)
    ("--git-dir"
     (unless magit-git--git-dir-cache
       (setq magit-git--git-dir-cache (apply fun args)))
     magit-git--git-dir-cache)
    ("--show-toplevel"
     (unless magit-git--toplevel-cache
       (setq magit-git--toplevel-cache (apply fun args)))
     magit-git--toplevel-cache)
    ("--show-cdup"
     (let ((cdup (assoc default-directory magit-git--cdup-cache)))
       (unless cdup
         (setq cdup (cons default-directory (apply fun args)))
         (push cdup magit-git--cdup-cache))
       (cdr cdup)))
    (_ (apply fun args))))

(advice-add 'magit-rev-parse-safe :around #'memoize-rev-parse)

(defvar-local magit-git--config-cache (make-hash-table :test 'equal))

(defun memoize-git-config (fun &rest keys)
  (let ((val (gethash keys magit-git--config-cache :nil)))
    (when (eq val :nil)
      (setq val (puthash keys (apply fun keys) magit-git--config-cache)))
    val))

(advice-add 'magit-get :around #'memoize-git-config)
(advice-add 'magit-get-boolean :around #'memoize-git-config)

आप सिर्फ melpa.org/#/memoize पैकेज का उपयोग क्यों नहीं करते ?
fommil

1
@fommil: मुझे कुछ आर्गन्स के लिए प्रति बफर रेव-पार्स को याद करने की आवश्यकता थी । मैं ज्ञापन पैकेज पर एक सरसरी नज़र के बाद ऐसा करने का कोई तरीका नहीं देख सकता था। इसके अलावा यह कहते हैं कि यह याद रखना नहीं संभाल सकता है nil
नवंबर को npostavs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.