การเปลี่ยนตัวพิมพ์ใหญ่ของชื่อไฟล์ใน Git


473

ฉันกำลังพยายามเปลี่ยนชื่อไฟล์ให้มีตัวพิมพ์ใหญ่ต่างจากที่เคยเป็นมา:

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

อย่างที่คุณเห็น Git มีความเหมาะสมมากกว่านี้ ฉันลองเปลี่ยนชื่อโดยใช้mvคำสั่งเก่าธรรมดาเช่นกัน แต่ Git ไม่รับการเปลี่ยนชื่อ (เป็นเปลี่ยนชื่อหรือเป็นไฟล์ที่ไม่ได้ติดตามใหม่)

ฉันจะเปลี่ยนไฟล์ให้มีตัวพิมพ์ใหญ่แตกต่างจากชื่อเดียวกันได้อย่างไร ฉันใช้ Mac OS X v10.7.3 (Lion) พร้อม Git 1.7.9.1 โดยใช้Z shell (zsh) 4.3.15


49
มันเป็นเพราะระบบไฟล์ osx เป็นกรณีที่รักษาและตัวพิมพ์เล็กโดยค่าเริ่มต้น คุณสามารถดำเนินการได้สองขั้นตอน:git mv myfile foo; git mv foo MyFile
tonio

16
ทำให้มันทำงานกับ "git mv --force myfile MyFile"
Marcello de Sales


7
เริ่มต้น git 2.0.1 (มิถุนายน 2014) git mv hello.txt Hello.txtจะทำงานกับระบบปฏิบัติการที่ไม่คำนึงถึงตัวพิมพ์ ดูคำตอบของฉันด้านล่าง
VonC

1
การเชื่อมโยงstackoverflow.com/questions/1793735/…
Oleg Estekhin

คำตอบ:


554

เริ่มต้น Git 2.0.1 (25 มิถุนายน 2014) ซึ่งเป็นเพียงแค่จะทำงานบนระบบปฏิบัติการกรณีตายgit mv

ดูกระทำ 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 นี้ถดถอยหรือไม่ทำงานบน Windows เมื่อวันที่ 2.15.1.windows.2 และยังคงต้องใช้ --force
TTimo

1
@Adowrath ข่าวดี!
VonC

จะใช้งานได้กับการใช้อักษรตัวพิมพ์ใหญ่ส่วนขยายด้วยหรือไม่ตัวอย่างเช่นหากมีชื่อไฟล์อิมเมจ TXT และฉันต้องการเปลี่ยนชื่อเป็น image.txt
siluveru kiran kumar

@siluverukirankumar ใช่ คุณมีปัญหากับ usecase หรือไม่?
VonC

1
ได้สิ่งนี้เพื่อทำงานบน windows โดยใช้คำสั่งนี้และgit config core.ignorecase false
John Targaryen

452

เมื่อพิจารณาคำตอบของ larsksคุณสามารถทำให้มันทำงานได้ด้วยคำสั่งเดียวด้วย "--force":

 git mv --force myfile MyFile

3
หากคุณอยู่ในระบบไฟล์ที่ไม่สำคัญและคุณได้รับข้อผิดพลาดร้ายแรง "อาร์กิวเมนต์ไม่ถูกต้อง" ให้ลองทำตามขั้นตอนเหล่านี้แทน: stackoverflow.com/questions/3011625/…
Levi

1
ในขณะที่นี่คือคำตอบที่ถูกต้องสำหรับขั้นตอนแรกคุณจะดำเนินการเปลี่ยนเป็นสาขาอื่นภายใต้ Mac OS X ได้อย่างไรเมื่อสาขาอื่นมีการใช้อักษรตัวพิมพ์ใหญ่เก่า ฉันได้รับข้อผิดพลาด ****: ไฟล์ต้นไม้ทำงานที่ไม่ได้ติดตามต่อไปนี้จะถูกเขียนทับโดยเช็คเอาต์: ****
TJChambers

1
สิ่งนี้ล้มเหลวในการคอมมิทสำหรับฉันบน Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog

98

บางครั้งคุณต้องการเปลี่ยนการใช้อักษรตัวพิมพ์ใหญ่ของชื่อไฟล์จำนวนมากบนระบบไฟล์ที่ไม่สำคัญตัวพิมพ์เล็กและตัวพิมพ์เล็ก (เช่นบน OS X หรือ Windows) การทำgit mvคำสั่งจะทำให้ยางรวดเร็ว เพื่อทำให้สิ่งต่าง ๆ ได้ง่ายขึ้นนี่คือสิ่งที่ฉันทำ:

  1. ย้ายไฟล์ทั้งหมดนอกไดเรกทอรีไปที่เดสก์ท็อป
  2. ทำgit add . -Aเพื่อลบไฟล์ทั้งหมด
  3. เปลี่ยนชื่อไฟล์ทั้งหมดบนเดสก์ท็อปให้เป็นตัวพิมพ์ใหญ่ที่เหมาะสม
  4. ย้ายไฟล์ทั้งหมดกลับไปที่ไดเรกทอรีต้นฉบับ
  5. git add .ทำ Git จะเห็นว่าไฟล์นั้นถูกเปลี่ยนชื่อ

ตอนนี้คุณสามารถคอมมิทว่าคุณได้เปลี่ยนชื่อไฟล์เป็นตัวพิมพ์ใหญ่


3
นี่เป็นค่าใช้จ่ายของประวัติทั้งหมดในไฟล์ที่คุณย้ายเข้าและออกใช่ไหม? ฉันเดา gv mv --force ไม่มีข้อบกพร่องนี้
LOAS

12
ไม่สิ่งนี้จะไม่ลบประวัติทั้งหมด ขอให้สังเกตว่าไม่มีการกระทำระหว่างสองเพิ่ม
Michael L Perry

63

ชื่อไฟล์ภายใต้ OS X ไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก (โดยค่าเริ่มต้น) นี่เป็นปัญหาของระบบปฏิบัติการมากกว่าปัญหาของ Git หากคุณลบและอ่านไฟล์คุณควรได้รับสิ่งที่คุณต้องการหรือเปลี่ยนชื่อเป็นอย่างอื่นแล้วเปลี่ยนชื่อกลับ


2
นอกจากนี้คุณยังสามารถgit clonerepo บนระบบ Linux เปลี่ยนชื่อไฟล์และคอมมิทเหล่านั้นสำหรับสถานการณ์นี้ (ถ้าคุณมีระบบ Linux อยู่ในมือ)
gitaarik

4
ที่จริงแล้วระบบไฟล์บน OS X อาจเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็กคุณสามารถกำหนดค่าในการติดตั้งได้ วิธีการตรวจสอบว่าพาร์ติชัน OS X เป็นแบบตรงตามตัวพิมพ์เล็กหรือใหญ่
Flimm

2
... ดังนั้น "(โดยค่าเริ่มต้น)" ในคำตอบ
larsks

4
เพื่อยืนยันคุณสามารถใช้git rm --cached fileorfolderเพื่อลบไฟล์หรือโฟลเดอร์ออกจากคอมไพล์โดยไม่ต้องลบไฟล์หรือโฟลเดอร์ออกจากระบบไฟล์ git add fileorfolderแล้วคุณก็สามารถเพิ่มไฟล์หรือโฟลเดอร์อีกครั้งกับ
kas

32

ตั้งค่าignorecaseเป็นfalsegit config

ในขณะที่โพสต์ต้นฉบับเป็นเรื่องเกี่ยวกับ "การเปลี่ยนตัวพิมพ์ใหญ่ของชื่อไฟล์ใน Git":

หากคุณพยายามเปลี่ยนตัวพิมพ์ใหญ่ของชื่อไฟล์ในโครงการของคุณคุณไม่จำเป็นต้องบังคับให้เปลี่ยนชื่อจาก Git IMO ฉันต้องการเปลี่ยนการใช้อักษรตัวพิมพ์ใหญ่จาก IDE / ตัวแก้ไขของฉันและตรวจสอบให้แน่ใจว่าฉันกำหนดค่า Git อย่างถูกต้องเพื่อรับการเปลี่ยนชื่อ

โดยค่าเริ่มต้นเทมเพลต Git นั้นถูกตั้งค่าให้ไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ในการตรวจสอบว่าคุณมีเทมเพลตเริ่มต้นให้ใช้--getเพื่อดึงค่าสำหรับคีย์ที่ระบุ ใช้--localและ--globalเพื่อบ่งบอกถึง Git ว่าจะรับคีย์ - ค่าคอนฟิเกอเรชันจากการกำหนดค่าที่เก็บ Git ในพื้นที่หรือส่วนกลาง ตัวอย่างเช่นหากคุณต้องการค้นหารหัสส่วนกลางของคุณcore.ignorecase:

git config --global --get core.ignorecase

หากสิ่งนี้กลับtrueมาตรวจสอบให้แน่ใจว่าได้ตั้งเป็น:

git config --global core.ignorecase false

(ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ที่เหมาะสมในการเปลี่ยนแปลงระดับโลก) และคุณมีสิทธิ์ ตอนนี้การติดตั้ง Git ของคุณจะไม่เพิกเฉยต่อการลงทุนและถือเป็นการเปลี่ยนแปลง

เป็นข้อเสนอแนะหากคุณกำลังทำงานในโครงการหลายภาษาและคุณรู้สึกว่าโครงการทั้งหมดไม่ควรได้รับการปฏิบัติเสมือนเป็นกรณีโดย Git เพียงแค่อัปเดตcore.ignorecaseไฟล์ในเครื่อง


6
และถ้าgit config --global --get core.ignorecaseไม่คืนสิ่งใด มันคือtrue?? เพราะหลังจากที่ฉันตั้งให้falseมันส่งกลับเท็จ (Windows 10)
ฟัลโบ

และดูเหมือนว่าจะไม่ทำงานตามที่คาดไว้ ฉันหมายถึงเดสก์ท็อปไคลเอ็นต์เห็นการเปลี่ยนแปลง แต่หลังจากคอมมิต / ซิงค์ชื่อไฟล์ยังคงไม่เปลี่ยนแปลงออนไลน์!
ฟัลโบ

ใช้งานได้สำหรับฉัน (และดีกว่าสำหรับหลายไฟล์มากกว่าการใช้git mv) ฉันยังสมมติว่าโดยค่าเริ่มต้นก็ถือว่าเป็นจริง (เช่นมันจะไม่สนใจกรณี) ไม่ว่าจะเป็นหรือตรงกับนโยบายของระบบปฏิบัติการที่จะปลอกชื่อไฟล์
Jerry

นั่นคือคำตอบ เพียงแค่ใช้มัน
Dave Everitt

1
นี่ควรเป็นคำตอบที่เลือก
Dave Everitt

7

คุณสามารถเปิดไดเรกทอรี ".git" แล้วแก้ไขไฟล์ "config" ในส่วน "[core]" ให้ตั้ง "ignorecase = true" และคุณเสร็จแล้ว;)


ดูเหมือนว่าควรเปลี่ยนเป็นเท็จเช่นนั้นคอมไพล์จะต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก?
โจนาธาน

1

หากต้องการgit mvไฟล์จำนวนมากเป็นตัวพิมพ์เล็กบน macOS:

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

มันจะเป็นตัวพิมพ์เล็กทั้งหมดในโฟลเดอร์


1

ตัวอย่าง Python นี้จะทำ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 เป็น ./src/images/testimage.png บน git
Mohak Londhe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.