2010-06-23 8 views
8

से ब्रांच किया गया है मेरे पास एक गिट रिपोजिटरी (अधिक या कम परियोजना इतिहास को कवर करना) और अलग-अलग स्रोत (केवल कुछ फाइलों के साथ एक टैरबॉल) है जो कुछ समय पहले (वास्तव में 2004 या 2005 में) फोर्क किया गया है।यह पता लगाना कि स्रोत किस प्रकार गिट

टैरबॉल के स्रोतों में काफी सारे बदलाव हुए हैं जिनमें से मैं कुछ शामिल करना चाहता हूं। अब सवाल यह है कि यह पता लगाने के लिए कि बदले गए स्रोतों के लिए वास्तव में शाखा बिंदु क्या था, वहां क्या हुआ है इसका न्यूनतम अंतर प्राप्त करने के लिए।

तो मैं मूल रूप से जो चाहता हूं वह गिट इतिहास में जगह ढूंढना है, जहां कोड मेरे स्रोतों के टैरबॉल के समान है। और मैं इसे मैन्युअल रूप से नहीं करना चाहता हूं।

यह भी उल्लेखनीय है कि बदले गए स्रोतों में केवल फाइलों का सबसेट शामिल है और कुछ फ़ाइलों को और अधिक विभाजित किया गया है। हालांकि वहां मौजूद कोड में केवल छोटे बदलाव और कई अतिरिक्त सुविधाएं मिलती हैं।

आपको लगता है कि के साथ खुद को खेलने के लिए चाहते हैं, स्रोतों के साथ टारबॉल here है और Git Gitorious पर होस्ट किया गया है: git://gitorious.org/gammu/mainline.git

+1

मैं ध्यान दें कि कि राल में सबसे पुराना फ़ाइलों 31/10/2006 12 पर संशोधित किया गया: 57। मैं वहां अपनी खोज शुरू करूंगा। – Douglas

+0

जैसा कि मूल पोस्ट में बताया गया है, मुझे लगभग पता है कि उन्होंने 2004/2005 में कहीं भी फोर्क किया था, लेकिन यह अभी भी मैन्युअल रूप से जांच करने के लिए बहुत अधिक है। –

उत्तर

4

सामान्य मामले में, आपको वास्तव में प्रत्येक प्रतिबद्धता की जांच करनी होगी, क्योंकि आपके पास यह जानने का कोई तरीका नहीं है कि क्या आपके पास एक बड़ा अंतर हो सकता है, अगले में छोटा अंतर हो सकता है, फिर दूसरा बड़ा अंतर, फिर एक माध्यम diff ...

आपकी सबसे अच्छी शर्त शायद विशिष्ट फ़ाइलों को सीमित करने जा रही है। यदि आप केवल एक फ़ाइल पर विचार करते हैं, तो उस फ़ाइल के सभी संस्करणों के माध्यम से इसे फिर से शुरू नहीं करना चाहिए (सूची पाने के लिए git rev-list <path> का उपयोग करें, इसलिए आपको प्रत्येक प्रतिबद्धता का परीक्षण करने की आवश्यकता नहीं है)। प्रत्येक प्रतिबद्धता के लिए जो फ़ाइल को संशोधित करता है, आप diff के आकार की जांच कर सकते हैं, और काफी जल्दी से न्यूनतम खोज सकते हैं। कुछ हद तक फाइलों के लिए ऐसा करें, उम्मीद है कि वे सहमत होंगे!

अंतरण के लिए स्वयं को सेट करने का सबसे अच्छा तरीका है अपने टैरबॉल में बस कॉपी करके अस्थायी प्रतिबद्धता बनाना, ताकि आप की तुलना करने के लिए tarball नामक एक शाखा हो। इस तरह, आप ऐसा कर सकता है:

git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done 

उनके diff आकारों के साथ सभी प्रतिबद्ध का एक अच्छा सूची प्राप्त करने के (पहले तीन स्तंभों SHA1 हो जाएगा, लाइनों की संख्या को जोड़ा, और लाइनों की संख्या हटा दिए गए)।फिर आप इसे awk '{print $1,$2+$3}' | sort -n -k 2 पर पाइप कर सकते हैं, और आपके पास कामों और उनके diff आकारों की एक क्रमबद्ध सूची होगी!

यदि आप परीक्षण करने के लिए स्वयं को एक छोटी सी मुट्ठी भर फाइलों तक सीमित नहीं कर सकते हैं, तो शायद मुझे git-bisect जैसा कुछ भी लागू करने का लुत्फ उठाया जा सकता है - बस एक छोटे से अंतर को कम करने की कोशिश करें, इस धारणा को ध्यान में रखें कि सभी संभावनाएं, आपके सर्वोत्तम मामले के पास आने के लिए छोटे अंतर भी होंगे, और इससे दूर तक बहुत बड़ा अंतर होगा। (कहीं न्यूटन की विधि और बाइनरी/ग्रिड खोज पर एक पूर्ण, शायद के बीच?)

संपादित करें: एक और संभावना है, Douglas' answer में सुझाव दिया, अगर आपको लगता है कि कुछ फ़ाइलें में कुछ करने के समान हो सकता है हैश करने के लिए है उन्हें git-hash-object का उपयोग करके, और फिर देखें कि आपके इतिहास में क्या काम करता है वह ब्लॉब है। ऐसा करने के तरीके के बारे में question with some excellent answers है। यदि आप इसे कुछ हद तक फाइलों के साथ करते हैं - अधिमानतः जो अक्सर बदलते हैं - आप लक्ष्य प्रतिबद्धता को बहुत तेज़ी से कम करने में सक्षम हो सकते हैं।

+0

मुझे लगता है कि आपके द्वारा देखे जा रहे फ़ाइल सेट को सीमित करने के लिए एक अच्छी जगह शायद फाइलें जो दोनों के लिए आम हैं लेकिन या तो लंबे समय में नहीं बदली हैं या शायद ही कभी एक (या बेहतर अभी तक) पेड़ में बदल गई हैं । शीर्षलेख फाइलें अच्छे उम्मीदवारों के साथ-साथ लंबे समय तक होने की संभावना है क्योंकि उनमें बहुत अधिक पागल प्रीप्रोसेसर सशर्त सामान नहीं होते हैं। वास्तविक कोड की तुलना में '# परिभाषा की लंबी रेखा के अंतर में परिवर्तनों को मापना बहुत आसान है। – nategoose

+0

यह सबसे अच्छा तरीका प्रतीत होता है। मैंने इसे केवल एक फ़ाइल का उपयोग न करने के लिए बदल दिया है, लेकिन एक पूर्ण फ़ाइल सूची में मेरे पास बदले पेड़ और संशोधनों की सीमित सूची में कुछ कोड भागों से अनुमान लगाया गया है। धन्यवाद। –

+1

यह मेरे लिए बहुत अच्छा काम करता है, हालांकि, मैं यह चेतावनी प्रदान करता हूं: यदि आप * निक्स और विंडोज (या मैक) के बीच फ़ाइलों को ले जा रहे हैं, * लाइन फीड * के सावधान रहें। Diff कमांड को -w विकल्प दें, इसलिए यह उन्हें अनदेखा कर देगा, अन्यथा आपको एक बड़ा अंतर मिल सकता है, जब वास्तव में दो फीड लाइन फ़ीड्स को छोड़कर समान होती हैं। –

0

कैसे कांटा बनाया गया था? क्या यह एक क्लोन था जिसे किसी और ने बनाया और फिर अपना काम किया? यदि हां, तो यह वास्तव में आसान है। आपको केवल एक स्थानीय शाखा बनाना है जो फोर्क से कोड में खींचता है। गिट फोर्क वाली शाखा के पूर्वजों को आपके मूल भंडार से काम करने के लिए इंगित करेगा और बोलने के लिए "बिंदुओं को कनेक्ट" करेगा ... यह इतिहास को आपके मूल भंडार से कांटा में फिर से जोड़ देगा।

आप ऐसा करने में सक्षम होना चाहिए:

git remote add thefork git://wherever.it.lives/thefork.git 

git fetch thefork 

git branch -f thefork-branch thefork/branchname 

git checkout thefork-branch 
इस बिंदु पर

, आप gitk चलाने के लिए और काँटेदार शाखा का पूरा इतिहास और अपने स्थानीय भंडार देख सकते हैं, और देखने के लिए अगर वे कनेक्ट या नहीं।

+0

आह, मैं स्पष्ट नहीं था कि फोर्क किए गए स्रोत केवल एक टैरबॉल हैं जो वास्तव में गिट रेपो नहीं हैं। इसे स्पष्ट करने के लिए प्रश्न अपडेट करेंगे। –

+0

आउच! हाँ ... यह मेरे लिए नया है ... यकीन नहीं है कि मुझे पता है कि उस स्थिति को कैसे संभालना है। –

2

कोई अच्छा समाधान नहीं है, लेकिन यह अनुमान लगाने के लिए कि कौन से संशोधन हो सकते हैं: मान लीजिए कि टैर बॉल में से कुछ फाइलों को ब्रांच नहीं किया गया है। टैर बॉल में प्रत्येक फ़ाइल के विरुद्ध git hash object चलाएं, फिर git show का उपयोग करके उन फ़ाइलों को रिपोजिटरी में खोजें। फिर उन फ़ाइलों को आज़माएं और ढूंढें जिनके तहत इन फ़ाइलों को शामिल किया गया था, संभवतः git whatchanged का उपयोग कर। आपके प्रश्न का उत्तर तब सबसे आम फाइलों के साथ प्रतिबद्ध हो सकता है, लेकिन यह अभी भी थोड़ा हिट और मिस होगा।

+0

यह एक अच्छा विचार है, असल में - मैंने अपना जवाब लिखा है कि सभी फाइलों में छोटे अंतर होंगे, और इसलिए आप रेपो में सटीक संस्करण नहीं ढूंढ पाएंगे। – Cascabel

+0

ग्रेट विचार, दुर्भाग्य से बदलावों के बिना कोई फ़ाइल नहीं है। –

+0

@Michal Čihař: फिर मेरे उत्तर पर जाएं, जो कम से कम diff संस्करण को खोजने और खोजने के कुछ बुनियादी तरीके प्रदान करता है! – Cascabel

0

एक अलग शाखा या पूरी तरह से नए पर एक गिट संशोधन में टैरबॉल में फ़ाइलों को आयात करें: संशोधन ग्राफ में स्थिति महत्वपूर्ण नहीं है, हम बस इसे एक पेड़ के रूप में उपलब्ध करना चाहते हैं।

अब मास्टर में प्रत्येक संशोधन के लिए, बस उस पेड़/संशोधन ('आयातित') के खिलाफ भिन्नता है और यह साबित करता है कि अंतर कितना बड़ा है। की तरह कुछ:

git rev-list master | while read rev; do patchsize=$(git diff $rev imported | wc -c); echo $rev $patchsize; done 

तो छोटी से छोटी पैच आकार के साथ संशोधन "निकटतम", अंगूठे का एक बहुत किसी न किसी नियम के द्वारा किया जाएगा। (एक समान संशोधन 0 के पैच आकार का उत्पादन करेगा, और कुछ भी निश्चित रूप से शून्य नहीं होगा, और जितना अधिक बदला जाएगा, बड़ा होगा)।

+0

दुर्भाग्य से पूरे पेड़ को अलग करने से हमेशा पुराने संशोधन होते हैं, क्योंकि इसमें इतनी सारी अतिरिक्त फ़ाइलें नहीं होती हैं। –

1

पर क्या araqnid मैं 9c6c864426bf88429e77c7e22b5aa78e9295b97a (बस 0.61.0 और सिर के बीच सामान के लिए कहा) यह शायद नहीं सबसे अच्छा है) क्या आप यह सोचते हैं की तरह

git rev-list --no-merges --all | while read rev; do patchsize=$(git diff $rev | wc -c); echo $patchsize $rev; done | sort -n | less 

कुछ के साथ बेहतर कर सकता है के साथ आया था ने कहा आधारित ' Git में टारबॉल आयातित कर लिया है और कि संशोधन की जाँच (मैं untaring द्वारा

git init 
git add . 
git commit -m "import tarball" 
git remote add origin git://gitorious.org/gammu/mainline.git 

ऐसा किया और उसके बाद है तो आप ऐसा कर और चलाने के उत्पादन के ऊपर यह होना चाहिए के आरोही क्रम में सभी डिफ के आकार के बाद पैचसाइज (पहला वाला 0 होगा चूंकि यह वर्तमान सिर पायेगा) इसमें काफी समय लगेगा ... लेकिन इसे सबसे छोटा अंतर मिलना चाहिए ...

0

यदि आपके पास कांटा हुआ कहां है, तो विल मैनली के उपयोग पर विचार करें git meld। (यह भी देखें: View differences of branches with meld?।)

ऐसा करने के लिए, अपने भंडार में टैरबॉल सामग्री जोड़ें (जो आप वैसे भी कर रहे हैं)। जब तक आप कम से कम अंतर के साथ मिल मिलकर एक हो जाना और git-meld, अलग करता पर

git meld branch_from_tarball commit_to_check & 

चलाने स्थापित करने के बाद। यह आदेश meld खुल जाएगा और निर्दिष्ट फ़ाइलों के साथ निर्देशिका ट्री में परिवर्तनों को छुपाएगा।उदाहरण स्क्रीनशॉट:

मिलकर एक हो जाना दिखा दो बहुत अलग करता:
Very different

इसी तरह के दो करता दिखा रहे हैं: Similar