2012-02-03 14 views
6

के साथ एक प्रतिबद्धता और उसके माता-पिता के बीच परिवर्तन प्राप्त करें मैं libgit2sharp (libgit2 के लिए एक सी # रैपर) के साथ काम कर रहा हूं और मुद्दों में भाग रहा हूं क्योंकि इसमें बहुत सारी कार्यक्षमता नहीं है जिसके लिए मैं उम्मीद कर रहा हूं (उम्मीद है कि मैं योगदान दे सकता हूं यह जल्द ही; यह वास्तव में उपयोगी प्रोजेक्ट की तरह लगता है)libgit2sharp

जो चीज़ मैं अभी करने की कोशिश कर रहा हूं उसे किसी विशेष प्रतिबद्धता और उसके माता-पिता से बदली गई फ़ाइलों की एक सूची मिलती है। मैं यह समझने की कोशिश नहीं करूंगा कि विलय और उसके दो माता-पिता के बीच क्या बदल गया है। मुझे नियमित प्रतिबद्धता में अधिक दिलचस्पी है।

ये लोग (https://github.com/libgit2/libgit2sharp/issues/89) कुछ इसी तरह काम कर रहे हैं। मुझे लगता है कि उनकी प्रक्रिया एक अच्छा विचार है, लेकिन मैं जीआईटी आंतरिक की मेरी समझ पर थोड़ा कमजोर हूं (जीआईटी के लिए अंतिम उपयोगकर्ता की मार्गदर्शिका पर गाइड की संख्या है लेकिन आंतरिक संरचना पर इतना अधिक नहीं है)

मुझे उत्सुकता है कि कैसे जीआईटी खुद एक "गिट diff" कमांड करता है। माना जाता है कि जीआईटी वास्तव में डेल्टा को स्टोर नहीं करता है बल्कि फ़ाइल का एक पूर्ण संस्करण है (यदि यह अपरिवर्तित है तो यह केवल मौजूदा SHA को इंगित करेगा। यह जानकारी विभिन्न स्रोतों जैसे http://xentac.net/2012/01/19/the-real-difference-between-git-and-mercurial.html) से मिल सकती है। ऐसा लगता है कि दो प्रतिबद्धताओं (मेरे मामले में एक विशेष प्रतिबद्धता और उसके एकल माता-पिता) के बीच परिवर्तन प्राप्त करना कठिन होता है क्योंकि डेटा प्रतिबद्धता के हिस्से के रूप में संग्रहीत नहीं होता है (जो स्पष्ट है कि यदि आप libgit2sharp के Commit.cs में Commit क्लास की जांच करते हैं तो यह स्पष्ट है। फ़ाइल)।

मैं जो प्रतिबद्धता से पहुंच प्राप्त कर सकता हूं वह पेड़ है। क्या यह जानकारी खोजने के लिए निम्नलिखित करना समझदारी होगी:

1) वांछित प्रतिबद्धता से शुरू करें और पेड़ पर चलें और सभी SHA मानों को एक सेट में स्टोर करें।

2) वांछित प्रतिबद्धता के लिए माता-पिता से शुरू करें और अपने पेड़ को अपने सभी ब्लॉब SHA मानों को किसी अन्य सेट में स्टोर करने के लिए चलाएं।

3) फ़ाइलों को बदलने के लिए एसएचए उन फ़ाइलों को होगा जो दो सेटों के चौराहे में नहीं हैं।

समस्या जो मैं इस दृष्टिकोण से देखता हूं वह ऐसा नहीं लगता है कि ब्लॉब के SHA मान से फ़ाइल नाम प्राप्त करने का कोई तरीका नहीं है (मुझे ऐसा कुछ भी नहीं दिख रहा है जो libgit2sharp की Blob.cs फ़ाइल में ऐसा कर सकता है)।

मुझे पता है कि इस प्रश्न के बहुत सारे पहलू हैं लेकिन वे गिट से डेटा का एक विशेष टुकड़ा प्राप्त करने के लिए इस बड़े लक्ष्य का हिस्सा हैं।

धन्यवाद।

+2

सावधान रहें कि अलग-अलग फ़ाइल नामों के साथ अलग-अलग 'TreeEntries' द्वारा अपने एसएचए के माध्यम से उसी 'ब्लॉब' को इंगित किया जाएगा। ऐसा तब होगा जब फ़ाइलों की एक ही सटीक सामग्री हो। – nulltoken

उत्तर

7

आप के बाद क्या कर रहे हैं, एक पेड़ diffing सुविधा, पहले से ही के रूप में tree.h header में परिभाषित libgit2 में मौजूद है।

git_tree_diff() फ़ंक्शन दो Trees की तुलना करता है और प्रत्येक अंतर (अतिरिक्त, अद्यतन और हटाने) के लिए कॉलबैक का आह्वान करता है। कॉलबैक फ़ंक्शन को git_tree_diff_data संरचना को विचाराधीन ब्लॉब, इसकी स्थिति, पूर्व और वर्तमान फ़ाइल मोड और पूर्व और वर्तमान SHA के फ़ाइलपैथ के साथ पारित किया जा रहा है।

LibGit2Sharp परिप्रेक्ष्य से, यह को मौजूदा libgit2 सुविधा को सी # में पुन: कार्यान्वित करने के बजाय अधिक समझ में आता है। हालांकि, अगर आप मौजूदा Interop definitions से कुछ प्रेरणा प्राप्त कर सकते हैं, तो नेट/मूल इंटरऑप परत को बदलने की कोशिश करते समय चीजें जल्दी से मुश्किल हो जाती हैं।

अपने दृष्टिकोण से (LibGit2Sharp के लिए योगदान नहीं कर सकते हैं अपने प्राथमिक लक्ष्य के रूप में;)), एक और विकल्प पोर्ट के लिए सी # सी कोड होगा, पेड़ों को चलने के लिए LibGit2Sharp मौजूदा सुविधाओं पर निर्भर। git_tree_diff() (और इसके उपग्रह कार्य) कोड का एक बहुत ही साफ टुकड़ा है, और हालांकि यह काफी जटिल काम करता है, टिप्पणियां बहुत स्पष्ट और सहायक होती हैं।

संदर्भ:

  • git_tree_diff() समारोह src/tree.c
  • इस सुविधा कसरत टेस्ट मैचों में कार्यान्वित किया जाता है उपलब्ध हैं here

नोट: आदेश टी में o git_tree_diff() बांधें, libgit2 tracker में एक समस्या खोली जानी चाहिए कि GIT_EXTERN 'डी होने के लिए विधि परिभाषा को अद्यतन किया जाना चाहिए। अन्यथा यह नेट से उपलब्ध नहीं होगा।

अद्यतन

रिलीज v0.9.0 LibGit2Sharp की अंततः ट्री diffing सुविधा के लिए ट्री लाया।

TreeChanges changes = repo.Diff.Compare(fromTree, newTree);

उजागर गुण हैं:

  • जोड़ा गया/संशोधित लाइनों
  • परिवर्तन की तरह प्रति TreeEntry परिवर्तन
  • diff के संग्रह (जैसे जोड़ा, संशोधित, ...।) पैच

आप इस सुविधा और लाभ का लाभ उठाने के बारे में अधिक जानकारी प्राप्त कर सकते हैं TreeChangesunit tests in DiffTreeToTreeFixture.cs पर एक नज़र डालकर।

+0

महान उत्तर के लिए बहुत बहुत धन्यवाद! मैंने देखा कि आप libgit2 और libgit2sharp दोनों में सक्रिय योगदानकर्ता हैं। मुझे इस परियोजना के साथ मदद करने में बहुत दिलचस्पी है इसलिए मैं देखूंगा कि क्या मैं libgit2sharp में libgit2 सुविधा का लाभ उठा सकता हूं। हालांकि मुझे नहीं पता कि कोई भी परियोजना किसी अन्य योगदानकर्ता की तलाश में है या नहीं। – bashirs

+0

प्रत्येक एफओएसएस को एक अच्छा पैच पसंद है ;-) – nulltoken