git mv और केवल डायरेक्टरी का मामला बदलते हैं


259

जब मुझे ऐसा ही सवाल मिला तो मुझे अपनी समस्या का जवाब नहीं मिला

जब मैं FOO से डायरेक्टरी का नाम बदलने की कोशिश करता git mv FOO fooहूं तो मुझे मिलता है

fatal: renaming 'FOO' failed: Invalid argument

ठीक है। इसलिए मैं कोशिश करता हूंgit mv FOO foo2 && git mv foo2 foo

लेकिन जब मैं पाने की कोशिश करता git commit .हूं

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

जब मैं git add fooकुछ भी नहीं के माध्यम से निर्देशिका जोड़ने और git commit .मुझे फिर से एक ही संदेश देता है।

मैं क्या गलत कर रहा हूं? मुझे लगा कि मैं एक केस-संवेदी प्रणाली (OSX) का उपयोग कर रहा हूं, तो मैं केवल निर्देशिका का नाम क्यों नहीं बदल सकता?


10
OS X की फ़ाइल प्रणाली केस-संवेदी नहीं है।
मपदी

2
@mipadi यह केस-संवेदी मोड में काम कर सकता है लेकिन यह आमतौर पर डिफ़ॉल्ट रूप से बंद होता है।
गॉर्डन

1
यह प्रश्न और इसके उत्तर विंडोज में भी उपयोगी हैं। अनटैगिंग "ओएसएक्स" पर विचार करें
बरट

1
देखें stackoverflow.com/a/24979063/6309 : git 2.0.1 के बाद से, एक सरल git mvकाम करता है।
वॉनसी

git mv foo Fooयदि आप एक साइबर शेल का उपयोग करते हैं तो विंडोज़ पर आप नियमित उपयोग कर सकते हैं ।
एंड्रयू स्कॉट

जवाबों:


409

आप एक मामले में असंवेदनशील वातावरण में हैं। इसके अलावा, बाहर निकालने के साथ जोड़ने -Aके mvरूप में Git इसे समझता है के पक्ष को दूर नहीं करेगा । चेतावनी! सुनिश्चित करें कि जब आप ऐसा करते हैं तो कोई अन्य परिवर्तन या अनट्रैक की गई फाइलें आसपास नहीं होती हैं या वे इस परिवर्तन के हिस्से के रूप में प्रतिबद्ध हो जाएंगे! git stash -uपहले, यह करो और फिर git stash popबाद में। जारी रखना: इसे प्राप्त करने के लिए, निम्नलिखित करें:

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

यही कारण है कि काम कर रहे डायरेक्टरी को बदलने, कमिट करने और फिर 2 कमिट्स को ढहाने का तरीका है। आप फ़ाइल को केवल अनुक्रमणिका में स्थानांतरित कर सकते हैं, लेकिन किसी ऐसे व्यक्ति के लिए जो नया है, यह स्पष्ट नहीं है कि क्या हो रहा है। छोटा संस्करण है

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

जैसा कि टिप्पणियों में से एक में सुझाव दिया गया है, आप git rebase -i HEAD~5वहां मामले को ठीक करने के लिए एक इंटरैक्टिव रिबेस ( अगर गलत मामला 5 कमिट पहले पेश किया गया था) कर सकते हैं और इतिहास में कहीं भी गलत मामला सामने नहीं आया है। आपको सावधान रहना होगा यदि आप ऐसा करते हैं तो प्रतिबद्ध हैश तब से अलग हो जाएगा और दूसरों को शाखा के उस हाल के अतीत के साथ अपने काम को फिर से बनाना या फिर से विलय करना होगा।

यह एक फ़ाइल का नाम सही करने से संबंधित है: क्या मामला संवेदनशील नहीं है?


1
धन्यवाद। यह मुझे पागल कर रहा था। मुझे -एंडएंडएम विकल्प के बारे में नहीं पता था।
ऑश्चरेंक

7
-A के साथ सावधानी बरतें, क्योंकि यह आपके वर्तमान निर्देशिका की सभी सामग्री को अनट्रैक किए गए सामान सहित पुन: जोड़ देगा। सिर्फ बेहतर हो सकता है git add foo2
अमीर।

2
वह सही है। हालाँकि आपको foo2 को हटाने के साथ-साथ FOO के जोड़ को अलग-अलग करने की आवश्यकता होगी। -Aदोनों का ख्याल रखता है। पहले चरण के लिए इसके विपरीत। मैं चेतावनी जोड़ दूंगा। धन्यवाद!
एडम डाइमिट्रुक

आप एक इंटरैक्टिव रिबेस के साथ अपने इतिहास को भी साफ कर सकते हैं git rebase -i HEAD~2। नोट: इसे सरल बनाने के लिए, अपने पहले कमिट में अंतिम संदेश सेट करें और दूसरे को ठीक करें।
एलेक्स बी।

5
मुझे git mv foo foo2 से सफलता मिली; git mv foo2 FOO; git कमिट
क्रिस

146

आप विकल्प core.ignorecaseको गलत पर सेट करना चाहते हैं , जो फ़ाइल सिस्टम पर केस का ध्यान देगा जो इसे मूल रूप से समर्थन नहीं करते हैं। अपने रेपो में सक्षम करने के लिए:

$ git config core.ignorecase false

तब आप फ़ाइल का नाम बदल सकते हैं git mvऔर यह अपेक्षित रूप से काम करेगा।


1
मुझे लगता है कि इसका अन्यत्र अवांछनीय प्रभाव हो सकता है। केस असंवेदनशील प्रणालियों को जीआईटी को यह सोचने देना चाहिए कि यह वही डायर है।
एडम डाइमिट्रुक

2
मैंने अपने वैश्विक विन्यास में विकल्प जोड़ा, लेकिन यह मदद नहीं की
oschrenk

3
मैं OSX के साथ इसका उपयोग करते हुए कुछ अजीब व्यवहार देखता हूं। hrm I modified a file that doesn't exist.. hrm error: The following untracked working tree files would be overwritten by checkout:लेकिन ... उन फ़ाइलों का अस्तित्व नहीं है।
स्काईलार सेवलैंड

यह ठीक वही है जिसकी मुझे तलाश थी। मैं CentOS 5.6 चला रहा हूं और इसने मामले के बदलाव को नहीं उठाया।
crampicco

5
यह काम नहीं करता है! Git 1.8.3 पर, Git, हटाए गए + जोड़े के बजाय, नई फ़ाइल को नई फ़ाइल के रूप में मानेगा। ऐसा करने से रिपॉजिटरी एक ही फाइल के साथ चलेगी, जैसे foo और FOO दोनों मौजूद हैं! लेकिन जब चेकआउट केवल एक फ़ाइल दिखाई देती है (लेकिन एक मामला दूसरे मामले पर हावी हो सकता है)
जॉनी वोंग

68

मैं इसे हल करने में सक्षम था, एक अस्थायी फ़ाइल नाम का उपयोग करके git 1.7.7:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"

दिलचस्प। शायद तब से जीआईटी में कुछ सुधार हुआ। जब मैं इस समस्या पर फिर से ठोकर खाऊंगा, तो मैं फिर से कोशिश करूँगा।
ऑस्क्रेनक

इस तरह से करना बहुत आसान है
ऑलोर

मेरे लिए macOS पर काम किया।
Mr_Pouet

14

( git mvमुक्त संस्करण)

मैं मैक ओएस एक्स 10.9 पर गिट में इस समस्या में भाग गया। मैंने इसे इस प्रकार हल किया:

git rm -r --cached /path/to/directory

यह Git में डिलीट करने के लिए डायरेक्टरी को स्टेज करता है लेकिन वास्तव में किसी भी फिजिकल फाइल ( --cached) को हटाता नहीं है । यह निर्देशिका भी बनाता है, अब उचित मामले के साथ, अनटैक की गई फ़ाइलों में दिखाई देता है।

तो आप यह कर सकते हैं:

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

गिट तब पहचान लेगा कि आपने फ़ाइलों का नाम बदल दिया है, और जब आप करते git statusहैं तो आपको कई renamed:पंक्तियों को देखना चाहिए । उनका निरीक्षण करें और सुनिश्चित करें कि वे सही दिखते हैं, और यदि ऐसा है, तो आप सामान्य रूप से बदलाव कर सकते हैं।


मैंने पाया कि mvकमांड वास्तव में निर्देशिका का नाम बदलने के लिए काम नहीं करता था; मुझे इसे फाइंडर के नाम से बदलना पड़ा। इसके अलावा यह फिक्स पूरी तरह से काम करता है।
एडम एस।

9

यह एक त्वरित और बग-सुरक्षित समाधान है:

git mv -f path/to/foo/* path/to/FOO/

चेतावनी! हमेशा बदला हुआ फ़ोल्डर में सभी फ़ाइलों का नाम बदलें (उपयोग करें /*)।

एकल फ़ाइलों का नाम न बदलें। यह इस उत्तर में वर्णित एक बग की ओर जाता है ।

यदि आप पहले परिणाम देखना चाहते हैं, तो उपयोग करें -n:

git mv -f -n path/to/foo/* path/to/FOO/

आपके द्वारा किए जाने के बाद mv:

  1. प्रतिबद्ध बदलाव
  2. किसी भी अन्य संशोधन के लिए चेकआउट
  3. चेकआउट वापस।

अब Git को अपनी आंतरिक फ़ाइलों और फ़ाइल सिस्टम में फ़ोल्डर BOTH का नाम बदलना चाहिए था।


क्या यह केवल Git 2.0.1 के लिए है जैसा कि मैंने उपरोक्त प्रश्न टिप्पणियों में उल्लेख किया है? ( stackoverflow.com/a/24979063/6309 का जिक्र करते हुए )
VONC

8

इसे बल के साथ -f विकल्प:

git mv -f FOO foo

मेरे लिए काम नहीं। मेरी सेटिंग .it / config का "ignorecase = true" है। नाम बदलने का मंचन इस तरह से मंचन क्षेत्र में नहीं किया जा सकता है। (Git संस्करण 1.8.3.msysgit.0) एडम डाइमिट्रुक का समाधान एकमात्र सही उत्तर है।
जॉनी वोंग

@ जॉनीवॉन्ग ने अपनी सेटिंग में बदलाव falseकिया, इसने मेरे लिए काम किया
इंद्र कुमार राठौर

क्या यह तब अन्य सभी उपयोगकर्ता के कंप्यूटरों पर अपडेट करेगा यदि वे खींचते हैं, भले ही उनका कंप्यूटर मामले को अनदेखा करने के लिए सेट हो?
ब्राइस

@Bryce नहीं, आपको बदलाव करने की आवश्यकता होगी और अन्य उपयोगकर्ताओं द्वारा परिवर्तन को खींचने से पहले उन्हें केंद्रीय रेपो में धकेल दिया जाएगा।
कोन्याक

3

मेरा एक संबंधित मुद्दा था।

एक फ़ोल्डर जिसका नाम 'प्रो' (पहला बनाया गया) और दूसरा 'प्रो' (गलती से बनाया गया) है। मैक में, यह एक ही चीज है, लेकिन गिट के अनुसार अलग है।

$ git config core.ignorecase false

git config फाइलों को राइट फोल्डर (धन्यवाद) में बदल देता है, और 'pro' (नहीं) में घोस्ट फाइल्स भी बनाता है। मैं ट्रैक में भूत फ़ाइल परिवर्तन नहीं जोड़ सका और मैं अन्य शाखाओं को चेकआउट नहीं कर सका जब तक कि मैं उन फ़ाइलों को अपने साथ नहीं ले गया, और मैं इसे किसी भी तरह से रीसेट नहीं कर सका।

इसके बजाय, मैंने किया

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

इसे अतिरिक्त सुरक्षित बनाने के लिए, मैंने इसे एक अलग फिक्स शाखा में किया, और फिर मैं वापस मुख्य शाखा में विलीन हो गया

द्वारा बनाई गई भूत फ़ाइल मुद्दे के लिए, क्या कोई गुरु कैसे और क्यों समझा सकता है? अग्रिम में धन्यवाद।


2

जब तक आप स्पष्ट रूप से ऐसा नहीं चुनते हैं, तब तक आप OS X में केस-संवेदी फाइलसिस्टम का उपयोग नहीं कर रहे हैं। HFS + केस-संवेदी हो सकता है, लेकिन डिफ़ॉल्ट केस-असंवेदनशील है।


4
OS X पर केस-संवेदी फ़ाइल सिस्टम का उपयोग करना एक अच्छा विचार नहीं है। बहुत सारे ऐप ठीक से काम नहीं करते हैं, मैंने यह कोशिश करने से सीखा है। एक विशेष समस्या यह है कि Adobe Photoshop यह कहते हुए इंस्टॉल करने से इंकार कर देगा कि केस-सेंसिटिव फाइल सिस्टम समर्थित नहीं है।
jpswain

1

यहाँ इस पृष्ठ पर सभी gitfoo के आसपास एक बहुत ही सरल समाधान है।

  1. अपने प्रोजेक्ट की फ़ाइलों को मैन्युअल रूप से कॉपी करें।
  2. git rm सभी फाइलें।
  3. सामान्य की तरह कमिट करें।
  4. फ़ाइलों को मैन्युअल रूप से जोड़ें।
  5. git सभी फ़ाइलों को जोड़ें।
  6. सामान्य की तरह कमिट करें।
  7. फायदा।

1
यह स्थानीय रूप से काम करता है, लेकिन अगर कोई और खींचता है तो यह उनके मामले को नहीं बदलेगा।
जेसन

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

0

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

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";

0

यह विंडोज पर मेरे लिए बहुत अच्छा काम किया। निम्नलिखित के साथ प्रयुक्त शक्तियां:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (वैकल्पिक) git push

ऊपर एडम के जवाब के लिए धन्यवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.