2009-11-22 6 views
49

गिट फ़ाइल संशोधन को इतनी तेजी से कैसे पहचानता है?गिट कैसे पता लगाता है कि एक फ़ाइल संशोधित की गई है?

क्या यह रेपो में हर फ़ाइल हैश और SHA1s की तुलना करता है? इसमें बहुत समय लगेगा, है ना?

या यह atime, ctime या mtime से तुलना करता है?

+0

विभिन्न प्लेटफार्मों के लिए अलग हो सकता है। मुझे विशेष रूप से दिलचस्पी है कि कैसे गिट/विंडोज – Pacerier

उत्तर

3

खैर मैं अनुमान लगाता हूं कि यह stat() कॉल के संयोजन का उपयोग कर रहा है, यह देखने के लिए कि यह कैसा दिख सकता है, फिर बदले में वास्तव में इसके diff'ing इंजन का उपयोग करके पता लगाने के लिए कह रहा है कि यह मामला है।

आप कुछ विचार पाने के लिए diff इंजन here के लिए कोड देख सकते हैं। मुझे यह सुनिश्चित करने के लिए कोडबेस के माध्यम से पता चला कि स्टेटस कमांड वास्तव में इस कोड में कॉल करता है (ऐसा लगता है कि बहुत सी चीजें होती हैं!) और असल में यह सब बहुत समझ में आता है जब आप जानते हैं कि गिट विंडोज पर बहुत बुरी तरह से प्रदर्शन करता है यह इन POSIX प्रकार कॉल करने के लिए एक इम्यूलेशन परत का उपयोग कर रहा है: यह उस प्लेटफ़ॉर्म पर git status करने के लिए धीमी गति का क्रम है।

वैसे भी, सभी कोड को ऊपर से नीचे तक पढ़ने के लिए छोटा है (जो बाद में मेरे पास समय हो सकता है!) जहां तक ​​मैं आपको अभी तक ले जा सकता हूं ... शायद अगर कोई काम करता है तो कोई और अधिक निश्चित हो सकता है कोडबेस के साथ।

नोट: एक और संभावित गति inline कार्यों के न्यायसंगत उपयोग से आता है जहां यह स्पष्ट रूप से समझ में आता है, आप इसे स्पष्ट रूप से शीर्षकों में देख सकते हैं।

[संपादित करें: stat() के लिए स्पष्टीकरण here देखें]

+0

यह समझाने की देखभाल करता है कि 'stat() 'क्या है/करता है? – hasen

+0

@ हंसन जे: stat() मैन पेज के संदर्भ के साथ अद्यतन किया गया। – jkp

6

की तरह "Git स्थिति" रिपोर्ट के लिए एक प्रारंभिक mtime की जांच नहीं है, लेकिन जब अंतिम प्रतिबद्ध गणना की जाती है, mtimes कोई फर्क नहीं है ... यह है SHA1 मायने रखता है।

+1

@ रंदल: मुझे नहीं लगता कि यह सच है, यह हमेशा एक diff करता है: http://gist.github.com/240775। अगर 'गिट स्टेटस' के लिए केवल माइटा का इस्तेमाल किया गया था तो आपको पेस्ट में संशोधन दिखाई देगा। – jkp

+2

@jkp मेरा स्वयं का स्ट्रेस-आईएन दिखाता है कि अपरिवर्तित वर्कट्री फ़ाइलों में केवल 'lstat' किया गया है। – Tobu

2

प्लेटफार्म के आधार पर, आपको यह पता लगाने में सक्षम होना चाहिए कि गिट किस स्थिति का पता लगाने के लिए उपयोग करता है। पर SunOS लिनक्स पर strace git status, truss git status, या उचित रूप में DTrace आधारित उपकरण है जो मैक ओएस एक्स पर अपने डेवलपर उपकरण के साथ एप्पल जहाजों

28

Git lstat (से आश्वस्त पाने के लिए कड़ी मेहनत की कोशिश करता है) मूल्य अकेले कि worktree से मेल खाता है की कोशिश करो सूचकांक, क्योंकि फ़ाइल सामग्री पर वापस गिरना बहुत महंगा है।

Documentation/technical/racy-git.txt बताता है कि कौन से स्टेट फ़ील्ड का उपयोग किया जाता है, और कैसे कम दौड़ की अवधि के कारण कुछ दौड़ की स्थिति से बचा जाता है। This article has some more detail

स्टेट मान छेड़छाड़ के सबूत नहीं हैं, futimens (3) देखें। फ़ाइल में बदलाव खोने में गिट को मूर्ख बनाया जा सकता है; जो सामग्री-हैशिंग की अखंडता से समझौता नहीं करता है।

+1

लेकिन क्या हर प्रतिबद्धता फाइल सामग्री पर वापस आती है? या यह प्रतिबद्धता पर भी अनुमान लगा रहा है? – Pacerier

संबंधित मुद्दे