เปลี่ยนกรณีของไฟล์บน Windows หรือไม่?


209

มีไฟล์สองสามไฟล์ใน codebase ที่ควบคุมโดยคอมไพล์ของเราที่ฉันต้องการเปลี่ยนชื่อ โดยเฉพาะฉันต้องการเปลี่ยนกรณีของไฟล์เพื่อให้sourceCode.javaเป็นSourceCode.javaเช่นนั้น ที่จับ: ฉันอยู่ในกล่อง Windows และระบบแฟ้มคิดว่าพวกเขาเป็นชื่อไฟล์เดียวกัน

ฉันจะทำให้ Windows และ Git จดจำการเปลี่ยนแปลงนั้นและตรวจสอบได้อย่างไร


3
ตั้งแต่ Git 2.0.1+ (มิถุนายน 2014) การgit mvทำงานแบบง่าย ๆ( stackoverflow.com/a/24979063/6309 ) แม้กระทั่งบน Windows
VonC

คำตอบ:


337

ดูที่นี่สำหรับคำแนะนำเพิ่มเติมเกี่ยวกับวิธีการทำ:

จะทำการเพิกเฉยต่อ git ได้อย่างไร?

หรือ:

git mv -f name.java Name.java

8
นอกจากนี้สิ่งนี้ไม่ทำงานบนระบบไฟล์ FAT ฉันพกรหัสโครงการบางส่วนไปไว้บนธัมบ์ไดรฟ์และการเปลี่ยนแปลงเคสเป็นเรื่องที่เจ็บปวดจริงๆ
asm

1
สิ่งนี้ไม่ได้ผลสำหรับฉันในระบบ NTFS และ Windows 10
Roboblob

1
นี่เป็นวิธีที่ถูกต้องในการทำ แต่ถ้าคุณต้องการเปลี่ยนชื่อไฟล์จำนวนมากอาจน่าเบื่อ หากคุณมีการเปลี่ยนชื่อไฟล์เหล่านั้นในระบบไฟล์อย่างใดและคุณเพียงแค่ต้องการส่งการเปลี่ยนแปลงเหล่านั้นคุณสามารถเปลี่ยนชื่อโฟลเดอร์พาเรนต์ใหม่ทำgit addโฟลเดอร์ที่เปลี่ยนชื่อใหม่ไม่ต้องผูกมัดเปลี่ยนชื่อโฟลเดอร์กลับไปเป็นสิ่งที่ควร , git addมันอีกครั้งและจากนั้นกระทำ
Okonomiyaki3000

ใช้งานได้กับระบบไฟล์ NTFS และ Windows 7
Hans Goldman

เป็นไปได้ไหมที่จะทำสิ่งนี้เป็นกลุ่ม? เช่นกับ powershellGet-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
killjoy

49

หากคุณอยู่ในระบบไฟล์ FAT ทางเลือกเดียวของคุณคือทำการเปลี่ยนชื่อสเตจสองรายการ:

  1. เปลี่ยนชื่อsourceCode.javaเป็นanything.you.like
  2. เปลี่ยนชื่อanything.you.likeเป็นSourceCode.java

ย้อนกลับไปในวันที่เราใช้ Perforce เราพบปัญหานี้อย่างแน่นอนและนี่เป็นทางออกเดียวที่เราสามารถหาได้


13
เพียงแค่หมายเหตุสำหรับคนอื่น ๆ : มันไม่จำเป็นที่จะต้องกระทำในระหว่าง แต่มันก็เป็นสิ่งจำเป็นที่จะเพิ่มไปยังดัชนีสำหรับคอมไพล์ที่จะสังเกตเห็นการเปลี่ยนแปลง
Arberg

29

ขั้นตอนต่อไปนี้อนุญาตให้ฉันเปลี่ยนเคสบน Windows:

  • เพิ่มignorecase = falseไป[core]ใน.git/config;
  • ย้ายไฟล์ที่คุณจะเปลี่ยนชื่อออกจากไดเรกทอรีโครงการของคุณ
  • เพิ่มการลบไปยังดัชนี
  • ย้ายไฟล์ทั้งหมดกลับไปที่ตำแหน่งเดิมและเปลี่ยนกรณีของไฟล์และ / หรือไดเรกทอรี;
  • เพิ่มไฟล์ "ใหม่" ทั้งหมดลงในดัชนี
  • ลบที่ignorecase = falseเพิ่มในขั้นตอนแรก

วิธีนี้คุณมีคอมมิทเดียวที่มีการเปลี่ยนชื่อและทำให้ง่ายต่อการเปลี่ยนเช่นไดเรกทอรีทั้งหมด


5
ใช้สำหรับการตั้งค่าระดับโลกและระดับท้องถิ่น: $ gti config - global core.ignorecase false $ gti config core.ignorecase false
Roman Ivanov

6

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

ดูที่Git rebase ปัญหาเกี่ยวกับไฟล์ที่มีชื่อเหมือนกัน แต่มีตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ต่างกัน

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


ควรหลีกเลี่ยงไฟล์ที่มีชื่อที่ไม่ได้ตั้งใจในโครงการขนาดกลางถึงขนาดใหญ่หากเป็นไปได้เนื่องจากทำให้เกิดปัญหาเมื่อพัฒนาสำหรับหลายแพลตฟอร์ม (การล่าช้าในการแก้ไขบางอย่างเช่นนั้นจนกระทั่งภายหลังจะทำให้ปัญหาจากการแก้ไขรุนแรงขึ้น) บางครั้งคุณกำลังพัฒนาบน windows แต่ยังต้องทำ linux build และการรวมที่จะทำงานได้ดีบน windows ทำให้ build แตกใน linux
Griffork

3

ในความคิดของฉันวิธีหนึ่งที่ง่ายหายไป คุณสามารถทำสิ่งนี้สำหรับไฟล์เดียวไดเรกทอรีเฉพาะหรือแม้แต่พื้นที่เก็บข้อมูลทั้งหมด:

git rm --cached <file name or directory>
git add <file name or directory>

หากคุณต้องการส่งผลกระทบกับไดเรกทอรีย่อยด้วยคุณต้องใช้การ-rตั้งค่าสถานะ:

git rm -r --cached <directory>
git add <directory>

แท้จริงหนึ่งที่ง่ายที่สุด
ranu

สิ่งนี้จะสูญเสียประวัติทั้งหมดของไฟล์เนื่องจากไฟล์ถูกตั้งค่าโดย git เป็นไฟล์ใหม่ทั้งหมด
Alejandro

@Alejandro สิ่งที่คุณพูดผิด ฉันเพิ่งทดสอบและ git รู้จักการเปลี่ยนชื่อโดยไม่มีปัญหาใด ๆ เช่นเดียวกับในกรณีอื่น ๆ ไฟล์จะถูกแสดงเป็นลบ / สร้างใหม่ในดัชนี แต่ในขณะที่ทำคอมไพล์สังเกตว่าคอมไพล์นั้นเพิ่งถูกเปลี่ยนชื่อ
Nils-o-mat

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.