2009-07-07 11 views
228

जो मुझे समझ में आता है, गिट को वास्तव में फ़ाइल नाम बदलने/स्थानांतरित करने/प्रतिलिपि चलाने की आवश्यकता नहीं है, तो वास्तविक उद्देश्य git mv का क्या उद्देश्य है? मैन पेज विशेष रूप से वर्णनात्मक नहीं है ...गिट-एमवी का उद्देश्य क्या है?

क्या यह अप्रचलित है? क्या यह एक आंतरिक कमांड है, जिसका उपयोग नियमित उपयोगकर्ताओं द्वारा नहीं किया जाना चाहिए?

mv oldname newname 
git add newname 
git rm oldname 

अर्थात यह स्वचालित रूप से दोनों पुराने और नए रास्तों के लिए इंडेक्स अपडेट:

उत्तर

300
git mv oldname newname 

बस आशुलिपि के लिए है।

+29

इसके अलावा इसमें कुछ सिक्योरिटीज भी बनाई गई हैं। –

+4

धन्यवाद @ चार्ल्सबैली - क्या गिट फिर फाइलें न्यूनामफाइल और पुरानीनामफाइल को अलग-अलग मानते हैं? यदि हां, तो क्या होगा यदि हम उन्हें मर्ज करना चाहते हैं? मान लें कि हम शाखा ए पर एक चींटी परियोजना की शाखा बनाते हैं और शाखा बी बनाते हैं, फिर बी पर परियोजनाओं को मंत्रमुग्ध करते हैं। फ़ाइल के नाम समान हैं लेकिन परियोजना संरचना के रूप में अलग-अलग पथों पर रखा गया है। कहें कि दोनों शाखाएं समानांतर में कुछ समय के लिए बढ़ी हैं। किसी बिंदु पर अगर हम परियोजनाओं को मर्ज करना चाहते हैं तो गिट कैसे पता चलेगा कि यह वही फाइल है जिसका नाम बदलकर इसका मार्ग बदल गया है?(यदि "गिट एमवी" == "गिट एड + गिट आरएम") – Rose

+0

मुझे लगता है, यह 99.9 999% संभावना के साथ ही वही बात है। जाहिर है, अगर आपके पास उदाहरण है तो ऑटो-डिटेक्शन गलत हो सकता है एक ही नाम और/या एक ही सामग्री के साथ कई फाइलें। – osa

59

official GitFaq से:

Git एक नाम बदलने आदेश git mv है, लेकिन है कि सिर्फ एक सुविधा है। प्रभाव फ़ाइल को दूर करने और विभिन्न नाम और एक ही सामग्री

+6

तो क्या आप फ़ाइल इतिहास खो देते हैं? मुझे लगता है कि नाम उस निर्देशिका के लिए पुराना इतिहास रखेगा ... –

+14

अच्छा, हाँ और नहीं। नाम के बारे में उपरोक्त आधिकारिक गिटफ़ैक लिंक पढ़ें, और फिर लिनस टोरवाल्ड्स को लंबे ईमेल को पढ़ें कि उन्हें एससीएम टूल ट्रैकिंग फ़ाइलों की धारणा क्यों पसंद नहीं है: http://permalink.gmane.org/gmane.comp.version- control.git/217 –

+2

@WillHancock मैंने अब थोड़ा और गिट का उपयोग किया है, और आपको अधिक निश्चित रूप से उत्तर दे सकता है: आपके गिट क्लाइंट और उसके विकल्पों के आधार पर, यदि आप आंतरिक रूप से फ़ाइल बदलते हैं तो आप नाम के पीछे फ़ाइल का पता लगाने में सक्षम होंगे पर्याप्त है कि यह एक नाम बदलता है। यदि आप फ़ाइल को बहुत अधिक बदलते हैं और इसका नाम बदलते हैं, तो गिट इसे पहचान नहीं पाएगा - एक अर्थ में यह कह रहा है "नहीं, आप शायद एक पूरी तरह से अलग फ़ाइल पर विचार कर सकते हैं!" –

18

के साथ एक और जोड़ने से अप्रभेद्य है @Charles कहते हैं, git mv एक आशुलिपि है।

असली सवाल यह है कि "अन्य संस्करण नियंत्रण प्रणाली (उदाहरण के लिए सबवर्जन और पर्सफोर्स) फ़ाइल का नाम विशेष रूप से नामित करता है। गिट क्यों नहीं है?"

लीनुस विशेषता चातुर्य के साथ http://permalink.gmane.org/gmane.comp.version-control.git/217 में बताते हैं:

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

+0

क्या आपके पास उस लिंक के लिए दर्पण है? अब टूट गया है विस्तृत विवरण के लिए – cjm

+4

https://web.archive.org/web/20160304045715/http://permalink.gmane.org/gmane.comp.version-control.git/217 –

25

गिट बस आपके लिए अनुमान लगाने की कोशिश कर रहा है कि आप क्या करने की कोशिश कर रहे हैं। यह अखंड इतिहास को संरक्षित करने के हर प्रयास कर रहा है। बेशक, यह सही नहीं है। तो git mv आपको अपने इरादे से स्पष्ट होने और कुछ त्रुटियों से बचने की अनुमति देता है।

इस उदाहरण पर विचार करें। एक खाली रेपो के साथ शुरू,

git init 
echo "First" >a 
echo "Second" >b 
git add * 
git commit -m "initial commit" 
mv a c 
mv b a 
git status 

परिणाम:

# On branch master 
# Changes not staged for commit: 
# (use "git add/rm <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: a 
# deleted: b 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# c 
no changes added to commit (use "git add" and/or "git commit -a") 

autodetection में विफल रहा है :( या यह क्या किया?

$ git add * 
$ git commit -m "change" 
$ git log c 

commit 0c5425be1121c20cc45df04734398dfbac689c39 
Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:24:56 2013 -0400 

    change 

और फिर

$ git log --follow c 

Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:24:56 2013 -0400 

    change 

commit 50c2a4604a27be2a1f4b95399d5e0f96c3dbf70a 
Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:24:45 2013 -0400 

    initial commit 

अब बजाय कोशिश (जब प्रयोग .git फ़ोल्डर को हटाने के लिए याद):

git init 
echo "First" >a 
echo "Second" >b 
git add * 
git commit -m "initial commit" 
git mv a c 
git status 

अब तक तो अच्छा:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# renamed: a -> c 


git mv b a 
git status 

अब , महोदय डीई सही है:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: a 
# deleted: b 
# new file: c 
# 

वास्तव में? लेकिन निश्चित रूप से ...

git add * 
git commit -m "change" 
git log c 
git log --follow c 

... और परिणाम से ऊपर के रूप में ही है: केवल --follow पूरा इतिहास को दर्शाता है।


अब,, नाम के साथ सावधान रहना के रूप में या तो विकल्प अभी भी अजीब प्रभाव उत्पादन कर सकते हैं। उदाहरण:

git init 
echo "First" >a 
git add a 
git commit -m "initial a" 
echo "Second" >b 
git add b 
git commit -m "initial b" 

git mv a c 
git commit -m "first move" 
git mv b a 
git commit -m "second move" 

git log --follow a 

commit 81b80f5690deec1864ebff294f875980216a059d 
Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:35:58 2013 -0400 

    second move 

commit f284fba9dc8455295b1abdaae9cc6ee941b66e7f 
Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:34:54 2013 -0400 

    initial b 

साथ कंट्रास्ट यह:

git init 
echo "First" >a 
git add a 
git commit -m "initial a" 
echo "Second" >b 
git add b 
git commit -m "initial b" 

git mv a c 
git mv b a 
git commit -m "both moves at the same time" 

git log --follow a 

परिणाम:

commit 84bf29b01f32ea6b746857e0d8401654c4413ecd 
Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:37:13 2013 -0400 

    both moves at the same time 

commit ec0de3c5358758ffda462913f6e6294731400455 
Author: Sergey Orshanskiy <*****@gmail.com> 
Date: Sat Oct 12 00:36:52 2013 -0400 

    initial a 

अप ... अब इतिहास प्रारंभिक एकके बजाय प्रारंभिक ख वापस जा रहा है, जो गलत है। तो जब हमने एक समय में दो कदम उठाए, तो गिट उलझन में आया और बदलावों को सही तरीके से ट्रैक नहीं किया। वैसे, मेरे प्रयोगों में ऐसा ही हुआ जब मैंने git mv का उपयोग करने के बजाय फ़ाइलों को हटा दिया/बनाया। देखभाल के साथ आगे बढ़ें; आपको चेतावनी दी गई है ...

+3

+1 आज़माएं। मैं उन समस्याओं की तलाश कर रहा हूं जो लॉग इतिहास में हो सकती हैं यदि फाइल गिट में स्थानांतरित हो जाती हैं, तो आपका जवाब वाकई दिलचस्प था। धन्यवाद! बीटीडब्ल्यू, क्या आप किसी अन्य समस्या को जानते हैं जिसे हमें गिट में फ़ाइलों को स्थानांतरित करते समय टालना चाहिए? (या कोई संदर्भ जो आप इंगित कर सकते हैं .... इसके लिए बहुत भाग्यशाली गुगल नहीं) – pabrantes

+1

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

6

ऊपर उल्लेखित git mv के लिए मेरे पास एक और उपयोग है।

git add -p (गिट एड के पैच मोड की खोज के बाद; http://git-scm.com/docs/git-add देखें), मैं इसे इंडेक्स में जोड़ने के रूप में परिवर्तनों की समीक्षा करने के लिए इसका उपयोग करना चाहता हूं। इस प्रकार मेरा वर्कफ़्लो (1) कोड पर काम करता है, (2) समीक्षा और सूचकांक में जोड़ें, (3) प्रतिबद्ध।

git mv कैसे फिट है? यदि फ़ाइल को सीधे git rm और git add का उपयोग करके, सभी परिवर्तन इंडेक्स में जोड़े जाते हैं, और परिवर्तन देखने के लिए गिट डिफ का उपयोग करना आसान होता है (काम करने से पहले)। git mv का उपयोग करते हुए, सूचकांक के लिए नया पथ जोड़ता है लेकिन फ़ाइल में किए गए परिवर्तन नहीं, इस प्रकार git diff और git add -p सामान्य रूप से काम करने की अनुमति देता है।

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