2009-06-25 4 views
116

के साथ रिकॉर्ड फ़ाइल कॉपी ऑपरेशन जब मैं गिट-एमवी का उपयोग करके गिट में फ़ाइल लेता हूं तो स्थिति दिखाती है कि फ़ाइल का नाम बदला गया है और यहां तक ​​कि अगर मैं कुछ हिस्सों को बदलता हूं तो भी यह लगभग एक ही चीज़ माना जाता है (जो अच्छा है क्योंकि यह मुझे इसके इतिहास का पालन करने देता है)।गिट

जब मैं एक फ़ाइल की प्रतिलिपि करता हूं तो मूल फ़ाइल में कुछ इतिहास होता है, मैं नई प्रतिलिपि से जोड़ना चाहता हूं।

मैंने फ़ाइल को स्थानांतरित करने का प्रयास किया है और फिर मूल स्थान पर पुनः जांच करने का प्रयास किया है - एक बार चले गए गिट मुझे मूल स्थान की जांच करने नहीं देंगे।

मैंने फाइल सिस्टम कॉपी करने का प्रयास किया है और फिर फ़ाइल - गिट को एक नई फाइल के रूप में जोड़ना है।

क्या गिट रिकॉर्ड फ़ाइल फ़ाइल ऑपरेशन को किसी भी तरह से फ़ाइल नाम बदलने/स्थानांतरित करने का कोई तरीका है जहां इतिहास को मूल फ़ाइल पर वापस देखा जा सकता है?

उत्तर

99

गिट ट्रैकिंग का नाम नहीं बदलता है और न ही ट्रैकिंग कॉपी करता है, जिसका अर्थ है कि यह रिकॉर्ड नाम या प्रतियां नहीं है। इसके बदले इसका क्या नाम है और पहचान का नाम बदलें। आप -M विकल्प का उपयोग करके git diff (और git show) में नाम बदलने का पता लगाने का अनुरोध कर सकते हैं, तो आप -C विकल्प (-C तात्पर्य -M) का उपयोग करके बदली हुई फाइलों में अतिरिक्त प्रतिलिपि का पता लगाने का अनुरोध कर सकते हैं, और आप --find-copies-harder साथ सभी फ़ाइलों के बीच और अधिक महंगा प्रतिलिपि का पता लगाने का अनुरोध कर सकते या -C -C (जो -C का तात्पर्य है, जो -M का तात्पर्य है)। git-diff मैनपेज देखें।

तुम भी Git कॉन्फ़िगर हमेशा एक बूलियन सही मूल्य (जैसे true या 1) को diff.renames की स्थापना करके पता लगाने के नाम कैसे बदलूं कर सकते हैं, और आप copy या copies को निर्धारित कर उसे भी प्रतिलिपि का पता लगाने क्या करना Git अनुरोध कर सकते हैं। git-config मैनपेज देखें।

-l विकल्प git diff और संबंधित कॉन्फ़िगरेशन चर diff.renameLimit पर भी विकल्प देखें।


ध्यान दें कि git log <pathspec> Git में अलग तरह से काम करता है: यहाँ <pathspec> पथ सीमांकक, जहां पथ एक (उप) निर्देशिका का नाम हो सकता है की निर्धारित है। यह से पहले नाम बदलने और प्रतिलिपि का पता लगाने के इतिहास को फ़िल्टर और सरल बनाता है। यदि आप नामों और प्रतियों का पालन करना चाहते हैं, तो git log --follow <filename> का उपयोग करें (जो वर्तमान में थोड़ा सीमित है, और केवल एक फ़ाइल के लिए काम करता है)।

+0

@allyourcode: क्या आप के बारे में उलझन कर रहे हैं? डिफ़ॉल्ट रूप से प्रतिलिपि पहचान को चालू करने के लिए आप 'diff.renames' को 'प्रतियां' पर सेट करें (उदा। '' गिट कॉन्फ़िगर diff.renames प्रतियां ')। मैं मानता हूं कि यह थोड़ा सा counterintuitive है। –

+0

एक अनुभाग मैं पार्स नहीं लग सकता है "और आप डिफ़ॉल्ट रूप से करने का अनुरोध भी पहचान का नाम बदल सकते हैं"। क्या आप कह रहे हैं कि चार मान हैं जो diff.renames (सत्य, 1, प्रतिलिपि, प्रतियां) का उपयोग कर सकते हैं, और वे सभी एक ही काम करते हैं? – allyourcode

+1

@allyourcode: मुझे खेद है, मैंने यह ध्यान नहीं दिया है। अब फिक्स्ड, धन्यवाद। –

5

आप Git की नकल की फ़ाइल के इतिहास का पता लगाने के लिए मजबूर कर सकते हैं:

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

(समाधान https://stackoverflow.com/a/44036771/1389680 से लिया।)

+0

सरलता, अल्पसंख्यक, 100% ... यह उत्तर सार्वजनिक सेवा है ... दृष्टि में सब कुछ ऊपर उठा रहा है – ptim