เปลี่ยนชื่อ submodule คอมไพล์


156

มีวิธีง่ายๆในการเปลี่ยนชื่อไดเรกทอรี submodule git (นอกเหนือจากการเคลื่อนไหวทั้งหมดของการ ลบมันและเพิ่มอีกครั้งด้วยชื่อปลายทางใหม่)

และในขณะที่เราอยู่ที่นี่ทำไมเป็นเพราะฉันไม่สามารถทำสิ่งต่อไปนี้ในไดเรกทอรีหลัก: git mv old-submodule-name new-submodule-name


6
คุณไม่จำเป็นต้องอัปเดต.gitmodulesด้วยตนเองเมื่อย้าย submodule ดูคำตอบของฉันด้านล่าง
VonC

@ คำตอบของ VonC ทำงานเหมือนมีเสน่ห์สำหรับฉัน
laconbass

โมดูล Git นั้นซับซ้อนเกินไป npmแสดงให้เห็นว่าการทำงานง่าย วันหนึ่ง ... บางที ... ใครสักคน ... จะเขียนใหม่ ... ในขณะเดียวกัน ...
Rolf

@ คำตอบของ VonC ไม่ใช่เรื่องเต็ม ณ วันนี้: แน่นอนมันจะเปลี่ยน. gitmodules แต่จะเปลี่ยนชื่อเส้นทางไม่ใช่ชื่อโมดูล คุณต้องแก้ไขเพิ่มเติมเพื่อ. gitmodules เพื่อแก้ไขและ 'git submodule sync' เพื่อทำให้กระบวนการทั้งหมดเสร็จสมบูรณ์
zertyz

@zertyz: คุณสมบัติ [submodule "name_of_submodule"] เป็นชื่อภายใน Git คุณสามารถเปลี่ยนชื่อได้โดยไม่ทำให้คุณสับสน แต่เป็นเพียงป้ายกำกับ
MKesper

คำตอบ:


101

ฉันพบว่าเวิร์กโฟลว์ทำงานต่อไปนี้:

  • อัปเดต. โมดูล
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

หมายเหตุ: วิธีการนี้จะไม่อัปเดตดัชนีและ. gitmodules อย่างเหมาะสมใน GIT เวอร์ชัน 2018

หมายเหตุ: คุณอาจจะสามารถตอนนี้เพียงแค่ทำgit mv oldpath newpathตอนนี้เป็นแหลมออกในVonC 's คำตอบ (ตรวจสอบว่าคุณใช้ git เวอร์ชันล่าสุด)


22
หมายเหตุถึงตัวเอง: เพราะgit add newpathอย่าใช้เครื่องหมายทับ
atomicules

10
ด้วยเวิร์กโฟลว์ดังกล่าวคุณจะสร้าง symlink ไปยังไดเรกทอรีย่อยที่คุณใช้เป็น submodule Symlink เป็นเพียงส่วนหนึ่งของฟังก์ชั่น submodule ทั่วโลก ซึ่งหมายความว่าเมื่อคุณโคลน repo ที่ใช้ submodules ที่เปลี่ยนชื่อคุณอาจจบด้วยข้อผิดพลาดต่อไปนี้: ไม่พบการแมป submodule ใน. gitmodules สำหรับ path 'your-oldpath' หลังจากคุณลบ oldpath (* git rm oldpath ) คุณควร ใช้git submodule เพิ่ม REPO-URL newpathแทน "git เพิ่ม newpath *. เมื่อเสร็จแล้วสถานะ git จะแสดงดังนี้: เปลี่ยนชื่อ: oldpath -> newpath
Bertrand

5
วิธีแก้ปัญหานี้ใช้ไม่ได้กับฉันเพราะเมื่อใช้คำสั่ง git add แล้ว submodule จะรวมอยู่ในโครงการเป็นไดเรกทอรีง่าย ๆ และไม่ใช่แบบ submodule ลองใช้ $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule เพิ่ม submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud อดัม

3
หากคุณมีปัญหากับแผนผังการทำงานคุณสามารถแก้ไข.git/modules/SUBMODULE/configไฟล์เช่นworktreeชี้ไปที่ไดเรกทอรีที่ถูกต้องอีกครั้ง
Vincent Ketelaars

3
2.13.1เรื่องนี้ไม่ได้ทำงานให้ฉันกับคอมไพล์ แต่เพียงทำgit mv old newผลงานได้อย่างมีเสน่ห์ ฉันเพียงแค่ต้องคอมไพล์ยอมรับเพื่อทำการเปลี่ยนแปลงให้เสร็จสมบูรณ์
ผู้ใช้

226

Git1.8.5 (ตุลาคม 2013) ควรลดความซับซ้อนของกระบวนการ เพียงทำ:

git mv A B

" git mv A B" เมื่อมีการย้าย submodule Aได้รับการสอนให้ย้ายต้นไม้การทำงานของตนและเพื่อปรับเส้นทางในที่.gitmodulesไฟล์


ดูเพิ่มเติมในการกระทำ 0656781fadca1 :

ขณะนี้การใช้ " git mv" บนซับโดuleจะย้ายแผนผังการทำงานของ submodule ในซูเปอร์โปรเจค แต่การตั้งค่าพา ธ ของ submodule .gitmodulesนั้นไม่ได้ถูกแตะต้องซึ่งตอนนี้ไม่สอดคล้องกับแผนผังการทำงานและทำให้คำสั่ง git ที่ขึ้นอยู่กับพฤติกรรมที่เหมาะสมpath -> name mapping(เช่นstatusและdiff)

ให้git mvความช่วยเหลือที่นี่โดยไม่เพียง แต่ย้ายทรีทรีของ submodule แต่ยังปรับปรุงการsubmodule.<submodule name>.pathตั้งค่าจาก.gitmodulesแฟ้มและสเตจทั้งสอง ""
สิ่งนี้จะไม่เกิดขึ้นเมื่อไม่.gitmodulesพบไฟล์และจะส่งคำเตือนเฉพาะเมื่อไม่มีส่วนสำหรับ submodule นี้ นี่เป็นเพราะผู้ใช้อาจใช้ลิงก์ git แบบธรรมดาโดยไม่มี.gitmodulesไฟล์หรืออัปเดตการตั้งค่าพา ธ ด้วยมือก่อนที่จะออกคำสั่ง "git mv" (ในกรณีนี้คำเตือนเตือนให้เขาทราบว่าmvจะต้องทำอย่างนั้น)
เมื่อ.gitmodulesพบและมีข้อขัดแย้งในการรวมmvคำสั่งจะล้มเหลวและแจ้งให้ผู้ใช้แก้ไขข้อขัดแย้งก่อนที่จะลองอีกครั้ง


git 2.9 (มิถุนายน 2559) จะปรับปรุงgit mvสำหรับ submodule:

ดูกระทำ a127331 (19 เมษายน 2016) โดยสเตฟานสนั่น (stefanbeller )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 9cb50a3 , 29 เมษายน 2016)

mv: อนุญาตให้ย้าย submodules ที่ซ้อนกัน

" git mv old new" ไม่ได้ปรับเปลี่ยนเส้นทางสำหรับ submodule ที่อยู่ในไดเรกทอรีย่อยภายในold/ไดเรกทอรีอย่างถูกต้อง

อย่างไรก็ตาม submodules จำเป็นต้องปรับปรุงการเชื่อมโยงไปยังไดเรกทอรี git เช่นเดียวกับการปรับปรุงไปยัง.gitmodulesไฟล์


หมายเหตุตนเอง: ลองนี้ 1.8.4 fatal: source directory is empty, source=my_source, destination=my_destinationและคุณจะมี จะลองอีกครั้งเมื่อ 1.8.5 ปล่อยเสถียร
เช็คซัม

@checksum แต่ 1.8.5 มีการเปิดตัวที่เสถียรเป็นเวลาอย่างน้อย ... ชั่วโมง;) github.com/git/git/releases/tag/v1.8.5
VonC

ฉันต้องสร้าง Git รุ่น 1.8.5.GIT จากซอร์สโค้ดเพราะมี Git v.1.7.5 ในที่เก็บ Ubuntu วิธีการสร้าง Git จากซอร์สโค้ด
Maksim Dmitriev

2
@MaksimDmitriev แต่สิ่งที่เกี่ยวกับ ppa (แพคเกจส่วนบุคคลที่เก็บถาวร) ที่ฉันพูดถึงในstackoverflow.com/a/20918469/6309 ?
VonC

2
git mv ใช้ไม่ได้กับจุดประสงค์นี้ในเครื่องของฉัน
Alexander Dyagilev

13

ทางออกที่ถูกต้องคือ:

mv oldpath ~/another-location
git rm oldpath
git submodule add submodule-repository-URL newpath

ที่มา: เปลี่ยนชื่อ submodule git


2
คุณดึงคำนี้เพื่อค้นหาคำจากตำแหน่งนี้หรือไม่? bcachet.github.io/development/2012/05/25/rename-git-submoduleหากเป็นเช่นนั้นโปรดตรวจสอบให้แน่ใจว่าได้ระบุแหล่งที่มาของไซต์นั้นในคำตอบของคุณ
George Stocker

11

ฉันลองทำตามคำแนะนำด้านบนสองสามข้อ ฉันกำลังวิ่ง:

$ git --version
git version 1.8.4

ฉันพบว่าเป็นการดีที่สุดที่จะยกเลิกการเริ่มต้น submodule ลบไดเรกทอรีและสร้าง submodule ใหม่

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

อย่างน้อยนั่นก็เป็นสิ่งที่ดีที่สุดสำหรับฉัน YMMV!


7

ไม่สามารถเปลี่ยนชื่อได้ดังนั้นคุณต้องลบออกก่อน ( deinit) และเพิ่มอีกครั้ง

ดังนั้นหลังจากลบมัน:

git submodule deinit <path>
git rm --cached <path>

คุณสามารถตรวจสอบอีกครั้งและลบการอ้างอิงถึงใน:

  • .gitmodules
  • .git/config
  • ลบโฟลเดอร์อ้างอิงออกจาก.git/modules/<name>(ควรทำการสำรองข้อมูล) เนื่องจากแต่ละโฟลเดอร์มีconfigไฟล์ที่เก็บการอ้างอิงไว้worktree

จากนั้นจัดลำดับการเปลี่ยนแปลงของคุณโดยยอมรับการเปลี่ยนแปลง repo ของคุณโดย:

git commit -am 'Removing submodule.'

และตรวจสอบอีกครั้งหากคุณไม่มีปัญหาที่โดดเด่นใด ๆ โดย:

git submodule update
git submodule sync
git submodule status

ดังนั้นตอนนี้คุณสามารถเพิ่ม submodule git อีกครั้ง:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

ยังเป็นจริงในวันนี้
Alexey

ชื่อคำถามนั้นเป็นชื่อเรียกผิดมันเกี่ยวข้องกับเส้นทางไม่ใช่ชื่อ
Max Robbertze

3

แก้ไขไฟล์. gitmodules เพื่อเปลี่ยนชื่อ submodule แล้วเปลี่ยนชื่อไดเรกทอรี submodule

ฉันคิดว่าคุณอาจต้องทำในgit submodule syncภายหลัง แต่ฉันไม่สามารถตรวจสอบได้ในขณะนี้


ซึ่งทำให้ชื่อ submodule ใหม่เกิดขึ้นเป็นการกระทำใหม่และไม่เป็นการเปลี่ยนชื่อ แต่นี่อาจเป็นวิธีที่มันควรจะเป็น?
Lars Tackmann

1
@ Lars: อย่าลืมลบไดเรกทอรี submodule เก่าด้วย!
Cascabel

3

MacOs : เมื่อฉันต้องการใช้โซลูชัน VonCเพื่อเปลี่ยนโฟลเดอร์ submodule Commonเป็นตัวพิมพ์เล็ก:

git mv Common common

ฉันเข้าใจ

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

โซลูชัน - ใช้ชื่อโฟลเดอร์ชั่วคราวและย้ายสองครั้ง:

git mv Common commontemp
git mv commontemp common

นั่นคือทั้งหมดที่ :)

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