ในที่เก็บ Git จะเปลี่ยนชื่อไดเรกทอรีได้อย่างไร


654

ฉันคิดว่ามันควรจะทำงานเพื่อคัดลอกไดเรกทอรีที่จะถูกเปลี่ยนชื่อไปยังไดเรกทอรีใหม่ที่มีชื่อที่ต้องการและลบไดเรกทอรีเก่าและgit add, git commitและpushทุกอย่าง แต่นี่เป็นวิธีที่ดีที่สุด?



5
เท่าที่ Git เกี่ยวข้องการคัดลอกและลบก็เหมือนกับการย้าย Git จะบันทึกทั้ง (คัดลอก + ลบ) และ (ย้าย) ด้วยวิธีเดียวกัน
Dietrich Epp

คำตอบ:


1182

เปลี่ยนชื่อพื้นฐาน (หรือย้าย):

git mv <old name> <new name>

การเปลี่ยนชื่อตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - เช่น จากcasesensitiveการCaseSensitiveได้คุณต้องใช้ขั้นตอนที่สอง:

git mv casesensitive tmp
git mv tmp CaseSensitive

( เพิ่มเติมเกี่ยวกับความไวตัวพิมพ์เล็กและใหญ่ใน Git … )

…ตามด้วยการกระทำและผลักดันจะเป็นวิธีที่ง่ายที่สุดในการเปลี่ยนชื่อไดเรกทอรีใน repo คอมไพล์


231
แต่ถ้าคุณต้องการเปลี่ยนชื่อจากcasesensitiveเป็นCaseSensitiveคุณสามารถทำเช่นนี้ได้ git mv casesensitive Tempแล้ว git mv Temp CaseSensitive
ViliusK

3
มันบันทึกบันทึกและสถิติทั้งหมดหรือไม่
orezvani

23
@ViliusK หากคุณกำลังจัดการกับไดเรกทอรี case case วิธีง่าย ๆ ที่ฉันได้พบgit rm -rf --cached path/to/your/directoriesแล้วเพิ่มอีกครั้งและกระทำ
dtothefp

1
แต่ทำไม GIT จึงไม่มีการสนับสนุนที่เหมาะสมสำหรับการเปลี่ยนชื่อสำหรับแพ็คเกจ / ไดเรกทอรี ทำไมฉันถึงต้องสร้างโฟลเดอร์แยกต่างหาก เมื่อฉันเปลี่ยนชื่อแพคเกจไม่ควรใช้มันเป็นความแตกต่างและดูแลมันในเวลาที่กระทำ & ดัน?
อาเหม็ด

1
ขอบคุณมากสำหรับสิ่งนี้ สำหรับฉันฉันต้องดำเนินการก่อนgit config core.ignorecase falseแล้วจึงเรียกใช้คำสั่งอย่างต่อเนื่องหรืออย่างอื่นส่วนที่สองฉันจะได้รับsource is emptyข้อผิดพลาด
Rika

107

หากคุณได้รับข้อผิดพลาดนี้: ร้ายแรง: การเปลี่ยนชื่อ 'foldername' ล้มเหลว: อาร์กิวเมนต์ไม่ถูกต้อง

ลองสิ่งนี้:

git mv foldername tempname && git mv tempname folderName


8
นี่คือสิ่งที่ฉันต้องการเพื่อทำการเปลี่ยนแปลงตัวพิมพ์ในไดเรกทอรี
cjserio

โทเค็น '&&' ไม่ใช่ตัวคั่นคำสั่งที่ถูกต้องในรุ่นนี้ git เวอร์ชั่น 2.11.0 หน้าต่าง
ทิม Hardy

@ Tim Hardy มันยังสามารถเรียกใช้เป็นสองคำสั่งแยกต่างหากgit mv foldername tempnameและgit mv tempname folderNameซึ่งควรทำงานบน Windows
Larkeith

มันไม่ทำงาน! ผลลัพธ์จะใส่โฟลเดอร์ 'folderName' ใหม่เข้าไปในโฟลเดอร์ 'tempname'
เดิมพัน

61

1. เปลี่ยนชื่อโฟลเดอร์จากโฟลเดอร์เก่าเป็นโฟลเดอร์ใหม่

git mv oldfolder newfolder

2. หากโฟลเดอร์ใหม่อยู่ในที่เก็บของคุณอยู่แล้ว & คุณต้องการแทนที่และใช้: - บังคับ

git mv -f oldfolder newfolder

อย่าลืมที่จะเพิ่มการเปลี่ยนแปลงในดัชนี & กระทำหลังจากเปลี่ยนชื่อด้วย git mv

3. การเปลี่ยนชื่อ foldername เป็น folderName บนระบบไฟล์ที่ไม่ต้องคำนึงถึงตัวพิมพ์ใหญ่ - เล็ก

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

git mv foldername folderName

หากคุณใช้ระบบไฟล์แบบไม่คำนึงถึงขนาดตัวพิมพ์เช่นคุณใช้ Mac และคุณไม่ได้กำหนดให้เป็นแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณจะพบข้อความแสดงข้อผิดพลาดดังนี้

ร้ายแรง: การเปลี่ยนชื่อ 'foldername' ล้มเหลว: อาร์กิวเมนต์ไม่ถูกต้อง

และนี่คือสิ่งที่คุณสามารถทำได้เพื่อให้มันใช้ได้: -

git mv foldername tempname && git mv tempname folderName

สิ่งนี้จะแยกกระบวนการเปลี่ยนชื่อโดยเปลี่ยนชื่อโฟลเดอร์ในตอนแรกเป็นชื่อเล่นที่แตกต่างอย่างสิ้นเชิง หลังจากเปลี่ยนชื่อเป็นชื่ออื่นที่แตกต่างกันในที่สุดก็สามารถเปลี่ยนชื่อโฟลเดอร์เป็นชื่อโฟลเดอร์ใหม่ หลังจากนั้น 'git mv's อีกครั้งอย่าลืมเพิ่มและกระทำการเปลี่ยนแปลง แม้ว่านี่อาจจะไม่ใช่เทคนิคที่สวยงาม แต่ก็ใช้งานได้ดีอย่างสมบูรณ์แบบ ระบบไฟล์จะยังไม่รับรู้การเปลี่ยนแปลงของตัวอักษร แต่ git ทำเนื่องจากการเปลี่ยนชื่อเป็นชื่อผู้ใช้ใหม่และนั่นคือทั้งหมดที่เราต้องการ :)


9

คุณสามารถเปลี่ยนชื่อไดเรกทอรีโดยใช้ระบบไฟล์ จากนั้นคุณสามารถทำgit rm <old directory>และgit add <new directory>( หน้าช่วยเหลือ ) จากนั้นคุณสามารถกระทำและผลักดัน

Git จะตรวจสอบว่าเนื้อหาเหมือนกันและเป็นเพียงการดำเนินการเปลี่ยนชื่อและจะปรากฏเป็นรายการเปลี่ยนชื่อในประวัติ คุณสามารถตรวจสอบว่าเป็นกรณีนี้ก่อนที่จะกระทำการใช้git status


12
เฮ้ แต่ด้วยวิธีนี้ฉันจะสูญเสียทั้งประวัติศาสตร์
ViliusK

1
คุณสามารถเก็บมันไว้หากคุณใช้แฟล็ก -follow
Oleksi

สองคำสั่งแทนคำสั่งเดียวและต้องเพิ่มการตั้งค่าสถานะหรือไม่ ดีกว่า git mv หรือเปล่า?
antgel

4
@topper ไม่ git mv เป็นเพียงนามแฝงสำหรับ rm + เพิ่ม การใช้ git mv เป็นทางออกที่ดีกว่า
Oleksi

5
@topper โปรดทราบว่าคุณยังต้องใช้ - ติดตามเพื่อดูประวัติโดยไม่คำนึงถึงวิธีการที่คุณใช้ในการย้ายไฟล์
Oleksi

3

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

ฉันมีปัญหาที่คล้ายกันมาก: ฉันต้องเปลี่ยนชื่อโฟลเดอร์ที่แตกต่างจากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก (เช่น Abc -> abc) ฉันได้เปลี่ยนชื่อโฟลเดอร์ทั้งหมดด้วยชื่อดัมมี่ (เช่น 'abc___') และแทนที่จะมุ่งมั่นที่พื้นที่เก็บข้อมูลระยะไกลหลังจาก ฉันเปลี่ยนชื่อโฟลเดอร์ทั้งหมดเป็นชื่อดั้งเดิมด้วยตัวพิมพ์เล็ก (เช่น abc) และใช้ชื่อเหล่านั้น!


0

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

ขั้นตอนที่ 1: เปลี่ยนชื่อโฟลเดอร์ (caseensitive) เป็นอย่างอื่นจาก explorer เช่นเปลี่ยนชื่อ caseensitive เพื่อ folder1 กระทำการเปลี่ยนแปลงนี้

ขั้นตอนที่ 2: เปลี่ยนชื่อโฟลเดอร์ที่เพิ่งตั้งชื่อใหม่นี้ (folder1) เป็นชื่อตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่คาดไว้ เปลี่ยนชื่อโฟลเดอร์ 1 เป็นกรณีละเอียด ยอมรับการเปลี่ยนแปลงนี้


0

สำหรับการเปลี่ยนชื่อตามตัวพิมพ์เล็กและใหญ่git mv somefolder someFolderได้ทำงานให้ฉันก่อนหน้านี้ แต่ไม่ได้ใช้ด้วยเหตุผลบางอย่าง ดังนั้นในการแก้ปัญหาฉันจึงสร้างโฟลเดอร์ใหม่tempย้ายเนื้อหาทั้งหมดของsomefolderไปเป็นtempลบsomefolderมุ่งมั่นtempแล้วสร้างsomeFolderย้ายเนื้อหาทั้งหมดของtempไปยังsomeFolderลบtempกระทำและผลักดันsomeFolderและทำงานได้! ปรากฏขึ้นsomeFolderในระบบคอมไพล์


-16

เพียงเปลี่ยนชื่อโฟลเดอร์ git คือ "content-tracker" ดังนั้นแฮช SHA1 จึงเหมือนกันและ git รู้ว่าคุณเปลี่ยนชื่อมัน สิ่งเดียวที่เปลี่ยนแปลงคือต้นไม้วัตถุ

rm <directory>
git add .
git commit

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