ฉันจะส่งการเปลี่ยนแปลงเฉพาะชื่อไฟล์ที่ตรงตามตัวพิมพ์ใหญ่ - เล็กใน Git ได้อย่างไร


1300

ฉันมีการเปลี่ยนแปลงชื่อไม่กี่ไฟล์โดย de-ประโยชน์ตัวอักษรตัวแรกในขณะที่ไปName.jpg name.jpgGit ไม่รู้จักการเปลี่ยนแปลงนี้และฉันต้องลบไฟล์และอัปโหลดอีกครั้ง มีวิธีที่ Git สามารถคำนึงถึงขนาดตัวพิมพ์เมื่อตรวจสอบการเปลี่ยนแปลงในชื่อไฟล์หรือไม่? ฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ กับไฟล์ของตัวเอง


4
@ ถ้ามันไม่ถูกต้อง Git มีการตั้งค่าที่ควบคุมได้จริงหรือไม่


6
ดูstackoverflow.com/a/24979063/6309 : ตั้งแต่ git 2.0.1 ซึ่งเป็นgit mvงานง่าย
VonC


อ้างอิงโพสต์นี้ ฉันสามารถคอมมิชชัน แต่ใช้ git commit -m "msg" โดยไม่มีพา ธ ของไฟล์เป็นพารามิเตอร์ มันปรับปรุงดัชนีและตรวจสอบในไฟล์ [ลิงก์] stackoverflow.com/questions/35790113/…
ARKS

คำตอบ:


1513

คุณสามารถใช้git mv :

git mv -f OldFileNameCase newfilenamecase

12
นี้ทำให้ฉัน 'ไดเรกทอรีแหล่งว่างเปล่า' ในขณะที่มันไม่ได้
WiseStrawberry

6
ใช้ MacOS ที่นี่ (FS ตัวพิมพ์เล็กและใหญ่) และ -f ใช้ได้! ขอบคุณสำหรับเคล็ดลับ
caesarsol

49
ในเวอร์ชันล่าสุดคุณไม่จำเป็นต้อง-fตั้งค่าสถานะอีกต่อไป
Joshua Pinter

8
อย่าลืมระบุเส้นทางไฟล์แบบเต็ม เห็นได้ชัดว่าฉันรู้ แต่ได้รับฉันในขณะนี้
rickrizzo

7
ไปด้านบนได้รับการโหวตความคิดเห็น: คุณทำต้อง-fสลับกับคอมไพล์ล่าสุด (2.18) มิฉะนั้นคุณจะได้รับfatal: destination existsข้อผิดพลาด
DeepSpace101

1035

Git core.ignorecaseมีการตั้งค่าการกำหนดค่าที่จะบอกว่ามันไม่ว่าจะเป็นกรณีที่มีความสำคัญหรือความรู้สึก: หากต้องการบอก Git ให้เป็นตัวพิมพ์ใหญ่ - เล็กให้ตั้งค่านี้เป็นfalse:

git config core.ignorecase false

เอกสาร

จากgit configเอกสาร :

core.ignorecase

หากเป็นจริงตัวเลือกนี้จะช่วยให้การแก้ไขปัญหาต่าง ๆ เพื่อให้ git ทำงานได้ดีขึ้นในระบบไฟล์ที่ไม่คำนึงถึงขนาดตัวพิมพ์เช่น FAT ตัวอย่างเช่นถ้าไดเรกทอรีรายชื่อพบmakefileเมื่อคาดว่าคอมไพล์Makefile, Makefileคอมไพล์จะถือว่ามันเป็นจริงไฟล์เดียวกันและยังคงจำได้ว่ามันเป็น

ค่าดีฟอลต์คือ false ยกเว้นgit-clone (1)หรือgit-init (1)จะโพรบและตั้งค่าcore.ignorecaseเป็นจริงหากเหมาะสมเมื่อสร้างที่เก็บ

ระบบไฟล์แบบคำนึงถึงขนาดตัวพิมพ์

ระบบปฏิบัติการที่ได้รับความนิยมสูงสุดสองระบบที่มีระบบไฟล์แบบไม่ตรงตามตัวพิมพ์เล็ก - ใหญ่ที่ฉันรู้

  • ของ windows
  • OS X

9
ในหมายเหตุด้านข้างฉันไม่คิดว่า Mac OS X นั้นเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่เป็นระบบไฟล์ที่กำหนดตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เมื่อทำการฟอร์แมตพาร์ติชัน HFS + ผู้ใช้สามารถเลือกได้ว่าจะให้ตรงตามตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
spaaarky21

225
ดูเหมือนว่าคุ้มค่ามากสังเกตในคำตอบนี้ที่ตั้งค่าตัวเลือกนี้falseบนระบบไฟล์กรณีตายเป็นความคิดที่ดี ไม่จำเป็นต้องชัดเจน ตัวอย่างเช่นผมเพียงแค่พยายามนี้บน Mac ของฉันคิดว่ามันจะแก้ไขปัญหาของฉันแล้วเปลี่ยนชื่อไฟล์จากไปproductPageCtrl.js เห็นไฟล์ใหม่ชื่อแต่ไม่คิดว่าถูกลบไปแล้ว เมื่อฉันเพิ่มไฟล์ใหม่มุ่งมั่นและผลักดันไปที่ GitHub ตอนนี้ GitHub repo มีทั้งสองไฟล์แม้ว่า repo ภายในของฉัน (ตามที่คาดคะเนไว้) มีเพียงคนเดียว ProductPageCtrl.jsgit statusProductPageCtrl.jsproductPageCtrl.js
Mark Amery

5
@ MarkAmery ฟังดูคล้ายกับบั๊กในไคลเอนต์ Git ของคุณ คุณยื่นรายงานหรือไม่
Domi

24
@Domi นี่ไม่ใช่ข้อผิดพลาดนี่เป็นพฤติกรรมที่คาดหวัง ในความเป็นจริงมันเป็นความคิดที่ดีที่จะตั้งค่านี้เป็นเท็จบนระบบไฟล์ที่ไม่รู้สึกเพราะนี่คือสิ่งที่เกิดขึ้น เหตุผลที่ git ไม่เห็นไฟล์ตัวพิมพ์เล็กถูกลบเพราะระบบไฟล์ไม่ได้รายงานว่าถูกลบเนื่องจากมันไม่สนใจเคสในขณะที่ git ไม่ได้ตั้งค่าตัวเลือกนี้เป็นเท็จ ไม่ใช่ว่าชื่อไฟล์จะไม่มีตัวพิมพ์ใหญ่และตัวพิมพ์เล็กบน ntfs หรืออ้วนมันคือการค้นหาชื่อไฟล์ที่ไม่สนใจตัวพิมพ์
ohcibi

15
@Domi คอมไพล์เป็นสมาร์ทพอ นั่นเป็นเหตุผลว่าทำไมคุณไม่ควรตั้งค่านี้เป็นเท็จบนระบบไฟล์ที่ไม่สนใจขนาดตัวพิมพ์ ใช้git mvเพื่อย้ายไฟล์และดูว่า git จัดการอย่างไร หากคุณย้ายไฟล์โดยไม่ต้องคอมไพล์ไม่มีสิ่งใดที่คอมไพล์สามารถทำได้เนื่องจากระบบไฟล์ไม่ได้บอกความจริงกับคอมไพล์ นี่เป็นปัญหาของ ntfs / fat / hfs และ thelike และไม่ใช่ git / linux
ohcibi

157

ใช้ SourceTree ฉันสามารถทำได้ทั้งหมดจาก UI

  1. เปลี่ยนชื่อ FILE.extเป็นwhatever.ext
  2. สเตจไฟล์นั้น
  3. ตอนนี้เปลี่ยนชื่อ whatever.extเป็นfile.ext
  4. สเตจไฟล์นั้นอีกครั้ง

มันค่อนข้างน่าเบื่อ แต่ถ้าคุณต้องการทำมันแค่สองสามไฟล์มันก็ค่อนข้างเร็ว


5
เช่นเดียวกันกับ git bash
Alex78191

3
"ขั้นตอนไฟล์นั้น" เป็นส่วนสำคัญ - ไม่มีคำตอบอื่นใดข้างต้นที่เหมาะกับฉัน ใช้งานได้จริงกับพรอมต์คำสั่ง Windows แบบเก่าธรรมดา
Vlad Sabev

1
ฉันไม่ได้ตระหนักถึงสิ่งนี้ทำงานผ่านพื้นที่การแสดงละคร แต่ในกรณีของฉันฉันต้องการแก้ไขชื่อโฟลเดอร์รวมถึงไฟล์บางไฟล์ภายในโฟลเดอร์เหล่านั้น ดังนั้นก่อนอื่นฉันเปลี่ยนชื่อโฟลเดอร์ทั้งหมดเป็นชื่อชั่วคราว ยอมรับชื่อใหม่ (ไฟล์ทั้งหมดภายใน) และไฟล์ "ลบ" Git ตั้งค่าสถานะพวกเขาทั้งหมดเป็น "เปลี่ยนชื่อ" จากนั้นเปลี่ยนชื่อโฟลเดอร์เหล่านั้นกลับไปเป็นเวอร์ชันเคสใหม่และคอมมิตอีกครั้ง ในที่สุดก็รวมกันทั้งสองกระทำ แต่จากสิ่งที่คุณเขียนฉันสามารถทำทุกอย่างผ่านพื้นที่การนับโดยตรงโดยไม่ต้องสร้าง 2 คอมมิชชัน + รวม
ThermoX

3
ใช้ได้กับ gitkraken ในชื่อโฟลเดอร์
Philippe Matray

ฉันเขียนสคริปต์ Python 3 เพื่อทำงานที่น่าเบื่อนี้: stackoverflow.com/a/58159822/4934640
ผู้ใช้

126

นี่คือสิ่งที่ฉันทำใน OS X:

git mv File file.tmp
git mv file.tmp file

สองขั้นตอนเพราะมิฉะนั้นฉันได้รับข้อผิดพลาด“ ไฟล์มีอยู่” บางทีมันสามารถทำได้ในขั้นตอนเดียวโดยการเพิ่ม--cachedหรือเช่น


21
ดังคำตอบที่ดีที่สุด-f(บังคับ) คือธงที่คุณกำลังมองหา
rperryng

5
@rperryng - ไม่แฟล็ก-fไม่ได้ช่วยในกรณีที่ FS พื้นฐานไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ อย่างไรก็ตามโซลูชันสองขั้นตอนใช้งานได้สำหรับฉัน
HEKTO

การใช้ FS แบบไม่ต้องสนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และใช้-fงานได้! ขอบคุณสำหรับเคล็ดลับ
caesarsol

นอกจากนี้ยังทำงานกับโฟลเดอร์บน windows โดยไม่ต้อง-fตั้งค่าสถานะ
nich

git -c "core.ignorecase=false" add .จะพิจารณาไฟล์ที่มีการเปลี่ยนแปลงเคสเพื่อคอมมิท
nietonfir

67

มันจะมีประโยชน์บางครั้งชั่วคราวเปลี่ยนความไวกรณีของ Git:

วิธีที่ # 1 - เปลี่ยนความไวตัวพิมพ์เล็กและตัวพิมพ์ใหญ่สำหรับคำสั่งเดียว:

git -c core.ignorecase=true checkout mybranchเพื่อปิด case-sensitive สำหรับcheckoutคำสั่งเดียว หรือมากกว่าโดยทั่วไป: . (ให้เครดิตกับ VonC สำหรับการแนะนำสิ่งนี้ในความคิดเห็น)git -c core.ignorecase= <<true or false>> <<command>>

วิธีที่ # 2 - เปลี่ยนความไวตัวพิมพ์เล็กและใหญ่สำหรับหลายคำสั่ง:

หากต้องการเปลี่ยนการตั้งค่าให้นานขึ้น (เช่นหากต้องใช้คำสั่งหลายคำสั่งก่อนเปลี่ยนกลับ):

  1. git config core.ignorecase(นี่จะคืนการตั้งค่าปัจจุบันเช่นfalse)
  2. git config core.ignorecase <<true or false>> - ตั้งค่าใหม่ที่ต้องการ
  3. ... เรียกใช้คำสั่งอื่น ๆ หลายคำ ...
  4. git config core.ignorecase <<false or true>> - ตั้งค่าการกำหนดค่ากลับเป็นการตั้งค่าก่อนหน้า

1
ทำไมไม่โดยตรงgit -c core.ignorecase=<true or false> checkout <<branch>>? ไม่มีอะไรให้รีเซ็ตหลังจาก
VonC

2
ฉันมีประสบการณ์แปลก ๆ ของ core.ignorecase ที่เสนอทำงานเมื่อเปลี่ยนจากตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ แต่ไม่ใช่สำหรับตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก ดูเหมือนว่าทางออกที่เชื่อถือได้เพียงอย่างเดียวคือการหยุดการใช้ระบบปฏิบัติการที่ล้มเหลวในการรับรู้ชื่อไฟล์
aspiringGuru

มีเหตุผลที่ควรเปลี่ยนแปลงชั่วคราวหรือไม่ จะทำให้เกิดปัญหาใด ๆ หรือไม่ถ้าฉันเพิ่งปล่อยให้การตั้งค่าเปลี่ยนเป็นตัวพิมพ์เล็กหรือใหญ่
cytsunny

ซึ่งอาจขึ้นอยู่กับปัจจัยหลายอย่างโดยเฉพาะอย่างยิ่งว่าระบบแฟ้มเป้าหมายเป็นกรณีที่สำคัญ - ดูen.wikipedia.org/wiki/Case_sensitivity#In_filesystems การเปลี่ยนแปลงชั่วคราวอาจจำเป็นถ้าระบบไฟล์การปรับใช้มีความไวตัวพิมพ์เล็กและตัวพิมพ์ใหญ่กับระบบไฟล์ที่ใช้สำหรับการพัฒนา นอกจากนี้ในกรณีของฉันฉันทำงานในทีมที่ทุกคนคาดว่าจะมีการตั้งค่า Git เหมือนกัน (เช่นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ดังนั้นถ้าฉันปิดมันต้องเป็นแบบชั่วคราว
Steve Chambers

44

ภายใต้ OSX เพื่อหลีกเลี่ยงปัญหานี้และหลีกเลี่ยงปัญหาอื่น ๆ ที่มีการพัฒนาในระบบแฟ้มกรณีตายคุณสามารถใช้ Disk Utility เพื่อสร้างกรณีที่มีความสำคัญไดรฟ์เสมือนภาพดิสก์ /

เรียกใช้ดิสก์ยูทิลิตี้สร้างภาพดิสก์ใหม่และใช้การตั้งค่าต่อไปนี้ (หรือเปลี่ยนตามที่คุณต้องการ แต่ให้คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่):

ภาพหน้าจอของ Mac Disk Utility

ตรวจสอบให้แน่ใจว่าได้บอกคอมไพล์ตอนนี้ในกรณีที่มีความอ่อนไหว FS:

git config core.ignorecase false

15
ไม่นิวเคลียร์กำลังใช้งานไดรฟ์สำหรับบู๊ตที่คำนึงถึงขนาดตัวพิมพ์บน OSX คุณจะต้องอยู่ได้โดยปราศจากแอป (ahem, Adobe) ที่เขียนได้ไม่ดีหรือเรียกใช้แอพเหล่านั้นใน VM ที่เป็นตัวพิมพ์เล็ก แต่ก็คุ้มค่าถ้าคุณใช้รหัสสำหรับระบบ * nix เป็นหลัก
Mike Marcacci

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

2
โปรดทราบว่า Disk Utility มีข้อผิดพลาด OS X 10.11 - มันจะไม่สร้างภาพเล็ก ๆ คุณต้องใช้เครื่องมือบรรทัดคำสั่ง hdiutil apple.stackexchange.com/questions/217915/…
dellsala

7
ด้วย APFS ใน High Sierra สิ่งนี้ง่ายยิ่งกว่า คลิกที่ไอคอนของไดรฟ์ที่มีเครื่องหมายบวกและเพิ่มไดรฟ์ข้อมูลตามตัวพิมพ์ใหญ่ - เล็กโดยไม่ จำกัด ขนาด เพียงแค่แชร์พื้นที่กับโวลุ่มหลักและเมานต์ที่ / Volumes / volume-name
Michael Fox

21

ฉันลองแก้ไขปัญหาต่อไปนี้จากคำตอบอื่น ๆ และพวกเขาไม่ทำงาน:

หากพื้นที่เก็บข้อมูลของคุณโฮสต์จากระยะไกล (GitHub, GitLab, BitBucket) คุณสามารถเปลี่ยนชื่อไฟล์บนต้นทาง (GitHub.com) และบังคับให้เปลี่ยนชื่อไฟล์ในลักษณะจากบนลงล่าง

คำแนะนำด้านล่างเกี่ยวกับ GitHub อย่างไรก็ตามแนวคิดทั่วไปที่อยู่เบื้องหลังควรนำไปใช้กับแพลตฟอร์มการโฮสต์ - พื้นที่เก็บข้อมูลระยะไกล โปรดจำไว้ว่าประเภทของไฟล์ที่คุณพยายามเปลี่ยนชื่อเรื่องไม่ว่าจะเป็นประเภทไฟล์ที่ GitHub เห็นว่าสามารถแก้ไขได้ (รหัสข้อความ ฯลฯ ) หรือแก้ไขไม่ได้ (รูปภาพไบนารี ฯลฯ ) ภายในเบราว์เซอร์

  1. เยี่ยมชม GitHub.com
  2. นำทางไปยังที่เก็บข้อมูลของคุณบน GitHub.com และเลือกสาขาที่คุณกำลังทำงาน
  3. ใช้เครื่องมือนำทางไฟล์ของเว็บไซต์นำทางไปยังไฟล์ที่คุณตั้งใจจะเปลี่ยนชื่อ
  4. GitHub อนุญาตให้คุณแก้ไขไฟล์ภายในเบราว์เซอร์หรือไม่?
    • ก.) แก้ไขได้
      1. คลิกไอคอน "แก้ไขไฟล์นี้" (ดูเหมือนว่าดินสอ)
      2. เปลี่ยนชื่อไฟล์ในการป้อนข้อความชื่อไฟล์
    • b.) ไม่สามารถแก้ไขได้
      1. เปิดปุ่ม "ดาวน์โหลด" ในแท็บใหม่และบันทึกไฟล์ลงในคอมพิวเตอร์ของคุณ
      2. เปลี่ยนชื่อไฟล์ที่ดาวน์โหลด
      3. ในแท็บก่อนหน้านี้บน GitHub.com คลิกไอคอน "ลบไฟล์นี้" (ดูเหมือนว่าถังขยะ)
      4. ตรวจสอบให้แน่ใจว่าได้branchnameเลือกปุ่มตัวเลือก"ยืนยันโดยตรงกับสาขา" แล้วคลิกปุ่ม "ยืนยันการเปลี่ยนแปลง"
      5. ภายในไดเรกทอรีเดียวกันบน GitHub.com คลิกปุ่ม "อัปโหลดไฟล์"
      6. อัปโหลดไฟล์ที่เปลี่ยนชื่อจากคอมพิวเตอร์ของคุณ
  5. ตรวจสอบให้แน่ใจว่าได้branchnameเลือกปุ่มตัวเลือก"ยืนยันโดยตรงกับสาขา" แล้วคลิกปุ่ม "ยืนยันการเปลี่ยนแปลง"
  6. ในพื้นที่ชำระเงิน / ดึง / ดึงสาขา
  7. เสร็จสิ้น

ฉันเปลี่ยนชื่อโดยตรงบน BitBucket และใช้งานได้ ขอบคุณ
rsc

ดีแล้วที่รู้. เทคนิคนี้ควรใช้งานได้จริงบนแพลตฟอร์มใด ๆ ที่เป็นพื้นที่เก็บข้อมูล แต่ฉันสนใจที่จะทราบว่ามีสิ่งใดที่มันจะไม่ทำงานด้วย
gmeben

ใช้งานไม่ได้กับไฟล์ที่ไม่สามารถแก้ไขได้ในเบราว์เซอร์เช่นรูปภาพหรือ PDF ไม่มีตัวเลือกการแก้ไขอย่างชัดเจน
Abhijit Sarkar

@AbhijitSarkar จุดดี ฉันอัปเดตคำตอบสำหรับกรณีเหล่านี้แล้ว ฉันทดสอบและตรวจสอบคำแนะนำเหล่านี้แล้ว
gmeben

ทุกคนจัดการเพื่อเปลี่ยนชื่อไดเรกทอรีด้วยวิธีนี้หรือไม่?
Solvitieg

20

คล้ายกับคำตอบของ @ Sijmen นี่คือสิ่งที่ฉันใช้กับ OSX เมื่อเปลี่ยนชื่อไดเรกทอรี (ได้แรงบันดาลใจจากคำตอบนี้จากโพสต์อื่น):

git mv CSS CSS2
git mv CSS2 css

เพียงแค่git mv CSS cssให้ข้อผิดพลาดของอาร์กิวเมนต์ที่ไม่ถูกต้อง: fatal: renaming '/static/CSS' failed: Invalid argumentอาจเป็นเพราะระบบไฟล์ของ OSX ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก

ps BTW ถ้าคุณใช้ Django, collectstatic ก็จะไม่รับรู้ถึงความแตกต่างของตัวอักษรและคุณต้องทำตามข้างต้นด้วยตนเองในไดเรกทอรี root แบบสแตติก


18

1) เปลี่ยนชื่อไฟล์Name.jpgเป็นname1.jpg

2) ส่งไฟล์ที่ลบแล้ว Name.jpg

3) เปลี่ยนชื่อไฟล์name1.jpgเป็นname.jpg

4) ไฟล์ที่เพิ่มเข้ามาname.jpgเพื่อกระทำก่อนหน้า

git add
git commit --amend

2
ฉันได้รับสิ่งนี้fatal: bad source, source=name1.jpg, destination=name.jpgในขั้นตอนที่ 3 คุณมีข้อเสนอแนะหรือไม่? ขอบคุณ
Anthony Kong

1
git addคุณไม่สามารถทำกระทำเพียง
Alex78191

ดูแฮ็คมากใช่ไหม? หรือการปะแก้ลิง
jeromej

18

ฉันใช้ขั้นตอนต่อไปนี้:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master

สำหรับฉันเป็นทางออกที่ง่าย


นี่คือทางออก และต่างจากคำตอบอื่น ๆ ที่ใช้งานได้ดีเมื่อคุณทำการเปลี่ยนชื่อแบทช์ บน glamourphilly.org เราจำเป็นต้องเปลี่ยนทุก. jpg เป็น. jpg ใน Finder คุณสามารถทำการเปลี่ยนชื่อแบทช์เช่นนั้นและคำตอบนี้ให้คุณตรวจสอบได้
William Entriken

11

เราสามารถใช้คำสั่ง git mv ตัวอย่างด้านล่างหากเราเปลี่ยนชื่อไฟล์ abcDEF.js เป็น abcdef.js เราสามารถเรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัล

git mv -f .\abcDEF.js  .\abcdef.js

8

Mac OSX High Sierra 10.13 แก้ไขปัญหานี้ได้บ้าง เพียงแค่สร้างพาร์ติชัน APFS เสมือนสำหรับโครงการ git ของคุณโดยค่าเริ่มต้นจะไม่มีการ จำกัด ขนาดและไม่มีพื้นที่

  1. ใน Disk Utility คลิกปุ่ม + ในขณะที่เลือกดิสก์คอนเทนเนอร์
  2. เลือก APFS (เล็ก - ใหญ่) ภายใต้รูปแบบ
  3. ตั้งชื่อมัน Sensitive
  4. กำไร
  5. ทางเลือก: สร้างโฟลเดอร์ใน Sensitive ที่เรียกว่าgitและln -s /Volumes/Sensitive/git /Users/johndoe/git

ไดรฟ์ของคุณจะอยู่ใน /Volumes/Sensitive/

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะส่งการเปลี่ยนแปลงเฉพาะชื่อไฟล์ที่ตรงตามตัวพิมพ์ใหญ่ - เล็กใน Git ได้อย่างไร


ฉันรักคำแนะนำนี้มันแก้ปัญหาได้อย่างหรูหราและไม่เจ็บปวดโดยไม่ต้องใช้วิธีแก้ปัญหาที่น่าเกลียด ขอบคุณ!
Phil Gleghorn

4

ฉันประสบปัญหานี้หลายครั้งใน MacOS Git คำนึงถึงขนาดตัวพิมพ์ แต่ Mac เป็นตัวพิมพ์เล็กและใหญ่

ใครบางคนกระทำไฟล์: และหลังจากนั้นไม่กี่วันก็ตัดสินใจที่จะเปลี่ยนชื่อเป็นFoobar.java FooBar.javaเมื่อคุณดึงรหัสล่าสุดมันจะล้มเหลวด้วยThe following untracked working tree files would be overwritten by checkout...

วิธีเดียวที่เชื่อถือได้ที่ฉันได้เห็นว่าการแก้ไขนี้คือ:

  1. git rm Foobar.java
  2. กระทำด้วยข้อความที่คุณไม่ควรพลาด git commit -m 'TEMP COMMIT!!'
  3. ดึง
  4. สิ่งนี้จะปรากฏขึ้นความขัดแย้งบังคับให้คุณรวมความขัดแย้ง - เนื่องจากการเปลี่ยนแปลงของคุณลบมัน แต่การเปลี่ยนแปลงอื่น ๆ เปลี่ยนชื่อ (ดังนั้นปัญหา)
    1. ยอมรับการเปลี่ยนแปลงของคุณซึ่งเป็น 'การลบ'
    2. git rebase --continue
  5. ตอนนี้วางการแก้ปัญหาของคุณgit rebase -i HEAD~2และdropTEMP COMMIT!!
  6. ยืนยันว่าไฟล์ถูกเรียกใช้ในขณะนี้ FooBar.java

3

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

  1. ลบไฟล์และโฟลเดอร์ที่ไม่ใช่ git ทั้งหมดไปยังโฟลเดอร์ / ที่เก็บอื่น
  2. ส่งโฟลเดอร์คอมไพล์ปัจจุบันที่ว่างเปล่า (จะแสดงเป็นไฟล์ทั้งหมดที่ถูกลบ)
  3. เพิ่มไฟล์ทั้งหมดกลับเข้าไปในโฟลเดอร์ / ที่เก็บ git ดั้งเดิม
  4. คอมมิตโฟลเดอร์คอมไพล์ที่ไม่ว่างเปล่าในปัจจุบัน

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


ทำไมไม่git commmit --amendอยู่ในวรรค 4? มิฉะนั้นจะมีข้อผูกมัดเพิ่มเติมเมื่อทำการลบไฟล์ทั้งหมด หรือคุณสามารถใช้git rebase -iกับสควอช
Alex78191

1

หากไม่มีสิ่งใดใช้งานได้ให้ใช้ชื่อไฟล์ git rm เพื่อลบไฟล์จากดิสก์และเพิ่มกลับ


0

ฉันตอบ@CBarrและเขียน Python 3 Script เพื่อทำรายการไฟล์:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import shlex
import subprocess

def run_command(absolute_path, command_name):
    print( "Running", command_name, absolute_path )

    command = shlex.split( command_name )
    command_line_interface = subprocess.Popen( 
          command, stdout=subprocess.PIPE, cwd=absolute_path )

    output = command_line_interface.communicate()[0]
    print( output )

    if command_line_interface.returncode != 0:
        raise RuntimeError( "A process exited with the error '%s'..." % ( 
              command_line_interface.returncode ) )

def main():
    FILENAMES_MAPPING = \
    [
        (r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
    ]

    for absolute_path, oldname, newname in FILENAMES_MAPPING:
        run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
        run_command( absolute_path, "git add '%s1'" % ( newname ) )
        run_command( absolute_path, 
             "git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
              newname ) )

        run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
        run_command( absolute_path, "git add '%s'" % ( newname ) )
        run_command( absolute_path, "git commit --amend --no-edit" )

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