2012-04-17 7 views
5

निम्नलिखित उपयोग करने पर विचार करें:एक नामित फ़ाइल का नया पथ कैसे ढूंढें जिसका मूल नाम ज्ञात है?

मैं अपनी स्थानीय शाखा पर काम कर रहा हूं जबकि मुख्य शाखा पर रिफैक्टरिंग किया गया है। अब कुछ फाइलों (कक्षाओं) का नाम बदल दिया गया है और/या नए स्थानों पर स्थानांतरित कर दिया गया है। जब विलय हो रहा है तो मुझे लापता वर्गों के कारण बहुत सारी और आयात-त्रुटियां मिलती हैं।

--A--B--C--D--E-- (master) 
    \   \ 
    F--G--H--I--J (topic) 

A में पुराने नाम जो मैं F--G--H--I में इस्तेमाल कर रहे हैं।

B--C--D--E में फ़ाइलों को दोबारा प्रतिक्रिया दी जाती है जिसके परिणामस्वरूप E में नए फ़ाइल नाम होते हैं। इस श्रृंखलित भी शामिल है अपनी शाखा को लापता हो refactorings के कारण

B: path/to/File.java    
-> C: path/to/BetterName.java 
-> D: better/package/BetterName.java 
-> E: final/package/FinalName.java 

जैसे कई (संकलन) त्रुटियों के साथ J में परिणाम अब विलय नाम बदलता है। (क्योंकि मैं अभी भी path.to.File के बजाय final.package.FinalName

के आदेश टूटा निर्माण को ठीक करने के लिए देखें, मैं वर्ष कक्षाओं के लिए नए नाम जानना चाहते हैं।

सभी renames है कि प्राप्त करने के लिए एक Git आदेश है किसी विशेष फ़ाइल पर लागू किया गया है?

+0

अपनी स्क्रिप्ट काम करता है के लिए एक विकल्प alias.history=!bash -ic 'git_file_history "[email protected]"' - जोड़ा? यदि हां, तो मुझे आपका प्रश्न नहीं मिला – CharlesB

+0

हां यह काम करता है लेकिन मैं सोच रहा था कि ऊपर लिपि की तुलना में एक सरल समाधान है या नहीं। जैसा कि मुझे हर फाइल के लिए करना है। – helt

+0

आपको '-एम' विकल्प के साथ नाम खोजने के लिए' गिट लॉग 'बताना होगा। फिर आप केवल नामों की रिपोर्ट करना चाहते हैं और यह '--diff-filter' विकल्प के साथ किया जाता है। मैंने अपने जवाब में और विस्तार जोड़ा है। –

उत्तर

0

गिट फ़ाइलों के नामों को ढूंढना चाहिए। हालांकि, अगर फ़ाइल में उस फ़ाइल में 50% या अधिक पंक्तियां बदल गई हैं, तो इसे अब नाम नहीं माना जाएगा। आप इसे बदल सकते हैं यदि आप चाहें तो थ्रेसहोल्ड।

यह करने का आदेश यहां दिया गया है:

git log -M --diff-filter=R --stat 

यह केवल आपको नाम दिखाएगा। आप से डिफ़ॉल्ट 50% अन्य कुछ और करने के लिए सीमा बदलना चाहते हैं, तो आप सिर्फ एम विकल्प के लिए संख्या जोड़ सकते हैं:

git log -M90 --diff-filter=R --stat 

का नाम बदलकर केवल एक फाइल पर विचार करेंगे, तो सामग्री कोई और अधिक से बदल दिया है 10% से

अद्यतन:

सभी मध्यवर्ती चरणों को छोड़ करने के लिए, बजाय diff का उपयोग करें। गिट आपके लिए नामों का पालन करेगा:

git diff -M --diff-filter=R --name-status ..master | cut -f2- 

जब आप अपनी विषय शाखा में हों।

फिर आप अपने संदर्भों को समायोजित करने के लिए sed निर्देशों का एक समूह बनाने के लिए इसे पाइप कर सकते हैं।

+0

अलग-अलग कामों में एक विशेष फ़ाइल का नाम बदलकर कई बार बदल दिया गया है, आपका आदेश काफी उपयोगी है, लेकिन मुझे अभी भी अपना लक्ष्य – helt

+0

प्राप्त करने के लिए इसे स्क्रैप करना होगा? आप आउटपुट को अपनी पसंद के अनुसार प्रारूपित कर सकते हैं। यदि आपको आवश्यकता हो तो आपको इसे कुछ और कमांड पर पाइप करने में सक्षम होना चाहिए। आपको अपना इतिहास चलने की आवश्यकता नहीं है। –

+0

'गिट लॉग-एम --डिफ-फ़िल्टर = आर - नाम-स्थिति - रिवर्स 'आवश्यक क्रम में सभी नामों की एक सूची प्रदान करता है (सबसे पुराना पहले)। लेकिन मेरे पास पुराना नाम है। समस्या पुराने नाम के प्रत्यक्ष नाम को नहीं ढूंढना है, बल्कि बाद में सभी निरंतर नामों को भी ढूंढना है। उम्मीद है कि अब कुछ हद तक समझ में आता है। – helt

-1

मैं वेब पर एक संतोषजनक जवाब नहीं मिल सकता है, तो मैं एक (अजीब) लिपि (नाम से नाम बदलने)

स्क्रिप्ट का उपयोग करते हुए ऊपर के उदाहरण के साथ प्रदान करता है एक एक करके लॉग के माध्यम से जाने के लिए लिखा गया है follwing उत्पादन:

$ git history path/to/File.java

final/package/FinalName.java

मैं अपने ~.bashrc स्क्रिप्ट जोड़ा गया है और मेरे वैश्विक Git config

#! /bin/sh 
### Takes a filename as parameter ($1) 
### Echoes all filenames related to $1 
function git_file_history() { 
     loc_var=$1; 
     old="" 
     while [ "$loc_var" != "$old" ] && [ "$loc_var" != "" ] 
     do 
       old=$loc_var; 
       #echo $loc_var; 
       hashes=$(git log --format="%P %H" -1 --follow -- $loc_var); 
       status=$(git diff --name-status --find-renames $hashes | grep $loc_var); 
       awks=`echo $status | awk '{print $3}'` 
       loc_var=$awks; 
     done 
     echo "$loc_var"; 
} 
संबंधित मुद्दे