गिट में फाइलनामों का पूंजीकरण बदलना


473

मैं एक फ़ाइल का नाम बदलने की कोशिश कर रहा हूँ जो पहले था उससे अलग पूंजीकरण:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

जैसा कि आप देख सकते हैं, गिट इस पर एक फिट फेंकता है। मैंने सिर्फ पुराने पुराने mvकमांड का उपयोग करके नाम बदलने की कोशिश की , लेकिन गिट नाम नहीं उठाता ( एक नया नाम या एक नई फ़ाइल के रूप में)।

मैं उसी नाम का एक अलग कैपिटलाइज़ेशन करने के लिए फ़ाइल कैसे बदल सकता हूं? मैं मैक ओएस एक्स v10.7.3 (शेर) पर जीआईटी 1.7.9.1 के साथ Z शेल (zsh) 4.3.15 का उपयोग कर रहा हूं।


49
ऐसा इसलिए है क्योंकि ऑक्स फाइल सिस्टम डिफॉल्ट रूप से असंवेदनशील है। आप बस दो चरणों में आगे बढ़ सकते हैं:git mv myfile foo; git mv foo MyFile
टोनियो

16
समझे "git mv --force myfile MyFile" के साथ काम करना।
Marcello de Sales


7
Git 2.0.1 (जून 2014) से, git mv hello.txt Hello.txtकेस असंवेदनशील OS पर काम करेगा। देखें नीचे मेरा उत्तर
VonC

जवाबों:


554

Git 2.0.1 (25 जून, 2014) से, git mvएक केस केवल असंवेदनशील OS पर काम करेगा

डेविड टर्नर ( ) द्वारा प्रतिबद्ध baa37bf देखें ।dturner-tw

mv: केस असंवेदनशील फाइल सिस्टम पर मामला ठीक करने के लिए नाम बदलने की अनुमति दें

" git mv hello.txt Hello.txt" एक मामले में असंवेदनशील फाइल सिस्टम हमेशा " destination already exists" ट्रिगर होता है , क्योंकि ये दो नाम फाइल सिस्टम के दृष्टिकोण से एक ही पथ को संदर्भित करते हैं और उपयोगकर्ता को --forceसूचकांक में दर्ज पथ के मामले को सही करते समय " " देने की आवश्यकता होती है। अगला वचन।

इस मामले का पता लगाएं और इसे " --force" की आवश्यकता के बिना अनुमति दें ।

git mv hello.txt Hello.txtबस काम करता है ( --forceअब कोई आवश्यकता नहीं)।


अन्य विकल्प है:

git config --global core.ignorecase false

और सीधे फ़ाइल का नाम बदलें; जोड़ और वचन।


2
FWIW ने इस विंडोज पर दोबारा काम किया या कभी काम नहीं किया। 2.15.1.windows.2 पर हूँ और अभी भी उपयोग करने की आवश्यकता है
टीटीमो

1
@ असंद्राथ महान समाचार!
VonC

क्या एक्सटेंशन कैपिटलाइज़ेशन के लिए भी यह काम करेगा, उदाहरण के लिए, अगर फ़ाइल का नाम image.TXT है और मैं इसे नाम बदलना चाहता हूँ जैसे कि image.txt
siluveru kiran kumar

@siluverukirankumar हाँ। क्या आपके पास उस usecase के साथ कोई समस्या है?
वॉन

1
इस आदेश को चलाकर खिड़कियों पर काम करने के लिए समझे औरgit config core.ignorecase false
जॉन टारगैरन

452

लार्क्स के जवाब को ध्यान में रखते हुए , आप इसे "--फोर्स" के साथ एकल कमांड के साथ काम कर सकते हैं:

 git mv --force myfile MyFile

3
यदि आप किसी मामले में असंवेदनशील फ़ाइल सिस्टम पर हैं और आपको एक घातक त्रुटि "अमान्य तर्क" मिलती है, तो इसके बजाय इन चरणों को आज़माएँ: stackoverflow.com/questions/3011625/…
Levi

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

1
यह विंडोज पर मेरे लिए प्रतिबद्ध में विफल रहा:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
ऑरेंजडॉग

97

कभी-कभी आप एक केस असंवेदनशील फाइल सिस्टम (उदाहरण के लिए ओएस एक्स या विंडोज) पर बहुत सारे फ़ाइल नामों के पूंजीकरण को बदलना चाहते हैं। कर git mvआदेश जल्दी थक जाएगा। चीजों को थोड़ा आसान बनाने के लिए मैं यही करता हूं:

  1. डेस्कटॉप से ​​बाहर सभी फ़ाइलों को स्थानांतरित करें, चलो, डेस्कटॉप कहते हैं।
  2. git add . -Aसभी फ़ाइलों को हटाने के लिए एक करें।
  3. डेस्कटॉप पर सभी फ़ाइलों का नाम बदलकर उचित कैपिटलाइज़ेशन करें।
  4. सभी फाइलों को मूल निर्देशिका में वापस ले जाएं।
  5. ए करें git add .। Git को देखना चाहिए कि फ़ाइलों का नाम बदला गया है।

अब आप कह सकते हैं कि आपने फ़ाइल नाम कैपिटलाइज़ेशन को बदल दिया है।


3
यह उन सभी इतिहासों की कीमत पर आता है जो आप अंदर और बाहर, दाईं ओर की फाइलों में हैं? मैं अनुमान लगा रहा हूँ mv --फोर्स में यह कमी नहीं है।
LOAS

12
नहीं, यह इतिहास को नहीं हटाएगा। ध्यान दें कि दोनों के बीच कोई प्रतिबद्धता नहीं है।
माइकल एल पेरी

63

OS X के तहत फ़ाइल नाम संवेदनशील नहीं हैं (डिफ़ॉल्ट रूप से)। यह एक Git समस्या की तुलना में OS समस्या से अधिक है। यदि आप फ़ाइल को निकालते हैं और पढ़ते हैं, तो आपको वह प्राप्त करना चाहिए जो आप चाहते हैं, या इसे किसी और चीज़ के लिए नाम बदलें और फिर इसे वापस नाम दें।


2
आप git cloneलिनक्स सिस्टम पर भी रेपो कर सकते हैं , फाइलों का नाम बदल सकते हैं और उन्हें केवल इस स्थिति के लिए कर सकते हैं (यदि आपके पास हाथ में लिनक्स सिस्टम है)।
गीताकार

4
दरअसल, ओएस एक्स पर फाइलसिस्टम केस-संवेदी हो सकते हैं, आप इसे इंस्टॉलेशन पर कॉन्फ़िगर कर सकते हैं। कैसे जांचें कि ओएस एक्स विभाजन केस-संवेदी है
फ्लिम

2
... इसलिए उत्तर में "(डिफ़ॉल्ट रूप से)"।
लार्क्स

4
पुष्टि करने के लिए, आप git rm --cached fileorfolderफ़ाइल या फ़ोल्डर को फ़ाइल सिस्टम से फ़ाइल या फ़ोल्डर को हटाने के बिना गिट से निकालने के लिए उपयोग कर सकते हैं । तब आप बस फ़ाइल या फ़ोल्डर को फिर से जोड़ सकते हैं git add fileorfolder
कास

32

सेट ignorecaseकरने के लिए falseGit config में

जैसा कि मूल पोस्ट "गिट में फ़ाइलनामों के बदलते पूंजीकरण" के बारे में है:

यदि आप अपने प्रोजेक्ट में फ़ाइल नाम का कैपिटलाइज़ेशन बदलने की कोशिश कर रहे हैं, तो आपको इसे Git से नाम बदलने के लिए मजबूर करने की आवश्यकता नहीं है । IMO, मैं अपने आईडीई / संपादक से पूंजीकरण को बदलूंगा और यह सुनिश्चित करूंगा कि मैं नाम बदलने के लिए Git को ठीक से कॉन्फ़िगर करूं।

डिफ़ॉल्ट रूप से, केस को अनदेखा करने के लिए एक Git टेम्पलेट सेट किया जाता है (Git केस असंवेदनशील)। यह सत्यापित करने के लिए कि आपके पास डिफ़ॉल्ट टेम्पलेट है, --getएक निर्दिष्ट कुंजी के लिए मान प्राप्त करने के लिए उपयोग करें। का प्रयोग करें --localऔर --globalGit को इंगित करने के लिए कि क्या आपके स्थानीय Git भंडार विन्यास या वैश्विक एक से एक विन्यास मुख्य मान लेने के लिए। एक उदाहरण के रूप में, यदि आप अपनी वैश्विक कुंजी को देखना चाहते हैं core.ignorecase:

git config --global --get core.ignorecase

यदि यह वापस आता है true, तो इसे इस प्रकार सेट करना सुनिश्चित करें:

git config --global core.ignorecase false

(सुनिश्चित करें कि आपके पास वैश्विक परिवर्तन के लिए उचित अनुमति है।) और वहां आपके पास है; अब आपकी Git स्थापना पूंजीकरणों की अनदेखी नहीं करेगी और उन्हें परिवर्तनों के रूप में मानती है।

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


6
और अगर git config --global --get core.ignorecaseकुछ भी वापस नहीं करता है। क्या यह true?? क्योंकि मैं इसे सेट करने के बाद falseइसे झूठा (विंडोज़ 10)
fralbo

और यह उम्मीद के मुताबिक काम नहीं कर रहा है। मेरा मतलब है कि डेस्कटॉप क्लाइंट को परिवर्तन दिखाई देता है, लेकिन प्रतिबद्ध / सिंक के बाद, फ़ाइल नाम अपरिवर्तित रहता है!
फ्रैलेबो

मेरे लिए काम किया (और उपयोग करने से कई फ़ाइलों के लिए बेहतर है git mv)। मैं यह भी मान रहा हूं कि डिफ़ॉल्ट रूप से इसे सच माना जाता है (यानी यह मामले की अनदेखी कर रहा है)। या तो, या यह नाम आवरण दर्ज करने के लिए ओएस की नीति से मेल खाता है।
जेरी

यह जवाब है। बस इसका इस्तेमाल किया।
डेव एवरिट

1
यह चयनित उत्तर होना चाहिए
डेव एवरिट

7

आप ".गित" निर्देशिका को खोल सकते हैं और फिर "कॉन्फ़िगरेशन" फ़ाइल को संपादित कर सकते हैं। "[कोर]" सेट के तहत, "अज्ञानी = सच्चा" सेट करें और आप कर रहे हैं;)


ऐसा लगता है कि इसे ऐसे झूठे में बदल दिया जाना चाहिए, जो इस मामले के प्रति संवेदनशील होगा?
जोनाथन

1

git mvMacOS पर फ़ाइलों को कम करने के लिए बल्क करें:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

यह एक फ़ोल्डर में सभी फ़ाइलों को कम कर देगा।


1

यह पायथन स्निपेट git mv --forceलोअरकेस होने के लिए एक डायरेक्टरी की सभी फाइलों को करेगा । उदाहरण के लिए, foo / Bar.js के माध्यम से foo / bar.js बन जाएंगे git mv foo/Bar.js foo/bar.js --force

इसे अपनी पसंद के अनुसार संशोधित करें। मुझे लगा कि मैं साझा करूँगा :)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)

-1

कार्य उदाहरण:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
आपका उत्तर मूल प्रश्न को हल नहीं करता है। आप एक्सटेंशन को कम कर रहे हैं
Tavo

मैं वास्तव में यह देख रहा हूं, लेकिन 500 छवियों के लिए। मैं नाम बदलना चाहता हूं ।/src/images/TESTIMAGE.png to ./src/images/testimage.png on git
Mohak Londhe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.