2010-11-14 12 views
18

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

कुछ प्रश्न पढ़ने के बाद (Getting Git to Acknowledge Previously Moved Files, How to make git mark a deleted and a new file as a file move?), मैं शुरू होने से कहीं अधिक खो गया हूं। यह उन उत्तरों से लगता है कि मैं इसे ठीक करने में सक्षम नहीं होगा? मैं वास्तव में यहां किसी भी मदद की सराहना करता हूं।

+3

@ जस्ट: इस बार आपकी राय गलत है। संस्करण नियंत्रण के बारे में प्रश्नों के लिए एसओ बिल्कुल सही जगह है। निश्चित रूप से पिछले गिट सवालों के ओपी के लिंक इसका सुझाव देते हैं? केवल एफएक्यू देखें: "आमतौर पर प्रोग्रामर द्वारा उपयोग किए जाने वाले सॉफ़्टवेयर टूल"। मुझे लगता है कि यह आपका करीबी वोट है - आप फिर से उस विशेषाधिकार का प्रयोग करने से पहले आपको अक्सर पूछे जाने वाले प्रश्न और विशेषाधिकार पृष्ठ पर जाना चाहिए। – Cascabel

+0

@ जेफ्रोमी: मैं आपको सुनता हूं, लेकिन चूंकि "टैग सेट" आया, इसलिए मैंने इस तरह की लड़ाई रोक दी;) http://blog.stackoverflow.com/2010/11/stack-overflow-homepage-changes/#comment देखें -51797। वे उन प्रश्नों को कहीं भी कहीं भी ले जा सकते हैं जहां भी वे चाहते हैं ... मैं उन्हें * देखूंगा;) – VonC

+0

@ वॉनसी: मैं तर्क दूंगा कि हमें अभी भी प्रश्नों को एक ही स्थान पर रखने की कोशिश करनी चाहिए, अगर हमारे लिए नहीं, लोगों के लिए उत्तर खोज रहे हैं। – Cascabel

उत्तर

9

गिट में फ़ाइल चाल की कोई अवधारणा नहीं है।

कुछ उपकरण, जैसे कि गिटहब, एक्स नामक एक फ़ाइल युक्त एक प्रतिबद्धता पर विचार करें जिसे हटा दिया गया है और एक्स नाम की एक फ़ाइल जिसे फ़ाइल चाल बनाया गया है।

लिनस टोरवाल्ड्स के अनुसार, फ़ाइल चाल केवल रेफैक्टरिंग का एक विशेष मामला है; इस कारण से गिट इसका अलग-अलग व्यवहार नहीं करेगा। इस विशेष मामले को संभालने, कई अन्य लोगों की तरह, उच्च स्तरीय उपकरण (जैसे फ्रंटेंड) तक छोड़ दिया जाता है।

इस विषय पर अधिक जानकारी के लिए, लिनस टोरवाल्ड्स से this answer देखें।

+2

मुझे सामान्य रूप से गिट के बारे में पता नहीं है, लेकिन यदि आप इसे स्थानांतरित करते हैं तो गिथब फ़ाइल का इतिहास खो देता है। मैं अब इस समस्या को अपने जीथब रिपोज में से एक में देख रहा हूं जहां मैंने एक संपूर्ण निर्देशिका संरचना को स्थानांतरित कर दिया है और इसमें सभी फाइलें अब उनके इतिहास में 1 तत्व होने के रूप में दिखाई देती हैं। – Powerlord

+0

आपके उत्तर में लिंक मर चुका है, क्या आपके पास दूसरा स्रोत है? या आप सिर्फ पूरा उद्धरण पोस्ट कर सकते हैं? – ProgrammerAtWork

+0

प्रदान किए गए लिंक से कोई अन्य स्रोत नहीं .. ऐसा लगता है कि पूरा http://permalink.gmane.org/ अपेक्षित के रूप में काम नहीं कर रहा है –

0

यदि आप वास्तव में अपने इतिहास से संशोधन खो रहे हैं (यह वास्तव में आपके प्रश्न से पूरी तरह से स्पष्ट नहीं है) और यह केवल एक महीने के आसपास रहा है, तो शायद आपके पास अभी भी समय है - रीफ्लॉग देखें; यह आपके द्वारा चेक किए गए प्रत्येक संदर्भ की एक प्रति रखता है, इसलिए यदि आप कोई गलती करते हैं तो आप पहले जो चाहते थे उसे वापस प्राप्त कर सकते हैं।

डिफ़ॉल्ट 90 दिनों के लिए रीफ्लॉग प्रविष्टियों को रखना है, वे git gc द्वारा समाप्त हो चुके हैं।

git help reflog 
+0

मुझे और स्पष्ट होना चाहिए था - मुझे डेटा याद नहीं है, लेकिन जब मैं अपने गिट जीयूआई में किसी दिए गए फ़ाइल के इतिहास को देखने का प्रयास करता हूं, तो यह केवल मेरे 'पुनर्गठन' प्रतिबद्धता को दिखाता है – refulgentis

2

क्या आपने config diff.renames सेटिंग्स को आजमाया है?

diff.renames 

renames पता लगाने के लिए Git कहता है। यदि किसी भी बूलियन मान पर सेट किया गया है, तो यह मूल नामकरण पहचान सक्षम करेगा। यदि "प्रतियां" या "प्रतिलिपि" पर सेट किया गया है, तो यह प्रतियों का पता लगाएगा।

नोट: renames भर में एक एकल फाइल के इतिहास का पालन करने के लिए, आप "git log -p --follow file" का उपयोग करने की जरूरत है।

+0

ऐसा लगता है कि टीसी ने वास्तव में एक फ़ाइल हटा दी है, और फिर इसे बाद में एक संशोधन (या ऐसा कुछ) बहाल कर दिया, जिसका अर्थ है कि गिट इसे नाम के रूप में नहीं पहचानता है। – erjiang

+0

मैंने किया - कोई पासा नहीं। यह भंडार भी गिटहब पर 'टूटा हुआ' है, अगर मैं इसे सही ढंग से पढ़ने के लिए गिटहब प्राप्त कर सकता हूं तो मैं खुश रहूंगा। – refulgentis

0

मैं एक ऐसी स्क्रिप्ट चलाउंगा जो सभी वस्तुओं के माध्यम से हो। आपको पहले सभी पैक फाइलों को अनपैक करना होगा। स्क्रिप्ट इस प्रकार की जांच करेगी, अगर यह एक प्रतिबद्धता है तो आप देखेंगे कि आप लेखक हैं या नहीं। फिर तारीख की जांच करें। उन फ़ाइल नाम के लिए उन और grep को सूचीबद्ध करें जिन्हें आप चाहते हैं। एक बार जब आप अपनी रुचि के लिए प्रतिबद्ध है,

git branch RecoveredWork hash-of-your-commit 

साथ एक शाखा बना सकते हैं और आप सभी कि आप

git log RecoveredWork --graph --decorate 
यहां से

साथ करना चाहते हैं यदि आप, शाखाओं में कलम बांधने का काम और/कुछ फिल्टर करने के लिए चाहते हो सकता है देखते हैं या इतिहास को फिर से जोड़ने के लिए पुन: प्रयास करना।

2

जहाँ तक मुझे यह देखने के रूप में आप चाहते हैं:

git log --follow some_file.cpp 

जानकारी के लिए http://git-scm.com/docs/git-log देखें। मुझे यकीन नहीं है कि क्या आप यही चाहते हैं; लेकिन गिट के मामले में, गिट सामग्री को फाइल नहीं ट्रैक करता है। समस्या यह है कि यह निर्धारित करना कि जानकारी वास्तव में महंगी है और यह माना जाता है कि आम तौर पर आपको इसकी आवश्यकता नहीं होती है ...

0

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

अगर ऐसी बात नहीं है, आप आप Git mv उपयोग कर सकते हैं, git log -M -C

2

साथ प्रतिबद्ध को देखने के लिए आवश्यकता हो सकती है आप के आसपास Git में फ़ोल्डर ले जाना चाहते हैं।

मेरे पास मेरे भंडार की जड़ में फ़ोल्डरों का एक समूह था, और उन्हें दो उपनिर्देशिकाओं में स्थानांतरित करना चाहता था, इसलिए मैंने ** mkdir का उपयोग करके दो नई निर्देशिकाएं बनाईं।

तो मैं इस तरह नई निर्देशिका में एक बार में फ़ाइलों और फ़ोल्डरों एक ले जाया गया:

git mv folder1/ newDirectory1/ 
git mv file1.txt newDirectory2/ 

आदि

मैं एक मामले में जहां मैं src को निर्देशिका में से एक का नाम बदलने का चाहती थी

git mv folder2 newDirectory1/src 

यह है कि इस तरह देखा फ़ाइलों का एक सेट के परिणामस्वरूप: और मैं इसे इस तरह से किया था

repository/ 
    newDirectory1/ 
     folder1/ 
     src/ 
    newDirectory2/ 
     file1.txt 

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

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