จะย้ายที่เก็บ git ไปยังไดเร็กทอรีอื่นและทำให้ไดเร็กทอรีนั้นเป็นที่เก็บ git ได้อย่างไร


104

ฉันมีไดเร็กทอรี gitrepo1 ไดเร็กทอรีนี้เป็นที่เก็บ git

  • ฉันต้องการย้ายgitrepo1นี้ไปยังไดเร็กทอรีอื่น newrepoอื่น

  • ไดเร็กทอรีnewrepoควรเป็นที่เก็บ git ใหม่โดยไม่มีการสูญเสียประวัติ git และควรมีไดเร็กทอรี gitrepo1

  • ไดเร็กทอรีgitrepo1ควรเป็นไดเร็กทอรีตอนนี้ (ภายในnewrepo ) โดยไม่มี.gitดัชนีใด ๆกล่าวคือไม่ควรเป็นที่เก็บ git อิสระหรือโมดูลย่อยอีกต่อไป

ฉันจะทำเช่นนี้ได้อย่างไร?


9
mv girepo1 newrepo??
ddavison

คำตอบ:


112

มันง่ายมาก Git ไม่สนใจว่าไดเรกทอรีชื่ออะไร ใส่ใจเฉพาะสิ่งที่อยู่ภายใน ดังนั้นคุณสามารถทำได้:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

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

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

เมื่อคุณสร้างnewrepoแล้วปลายทางที่จะวางgitrepo1อาจอยู่ที่ใดก็ได้แม้ว่าnewrepoคุณจะต้องการก็ตาม มันไม่ได้เปลี่ยนขั้นตอนเพียงแค่เส้นทางที่คุณกำลังเขียนgitrepo1กลับ


6
+1. อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงgotcha นี้ที่มีผลต่อที่เก็บที่สร้างด้วย git เวอร์ชัน 1.7.8 หรือ 1.7.9 ซึ่งอาจหมายถึงการย้าย git repo ทำให้ไม่สามารถใช้งานได้ (แม้ว่าจะระบุว่าแก้ไขได้ง่าย)
AD7six

1
ฉันอยู่บนเครื่อง wndows และใช้พรอมต์คำสั่ง ฉันไม่พบคำสั่ง "cp" คำสั่ง "cp" เฉพาะสำหรับ OS อื่นหรือไม่
LP13

2
@ user3862378 cpเช่นเดียวกับคำสั่งหรือฟังก์ชั่นเกือบทุกคำสั่งเฉพาะสำหรับOS อื่น ๆ อันที่จริงมันเฉพาะสำหรับทุก OS ที่ไม่ใช่ windows ลองโทรไปที่ microsoft และถามพวกเขาว่าทำไมพวกเขาถึงไม่เป็น POSIX อย่างไรก็ตามcpหมายถึงสำเนา mvหมายถึงการย้าย rmหมายถึงลบ คุณสามารถค้นหาการเทียบเท่าของ windows
Shahbaz

@Shahbaz ขอบคุณโซลูชันด้านบนสร้างโครงสร้างต่อไปนี้ "newrepo ->. git" และ "newrepo-> ไฟล์อื่น ๆ ทั้งหมดจาก gitrepo1" ... มันไม่ได้ใส่โฟลเดอร์ "gitrepo1" ไว้ใน "newrepo" .. ฉันอยากรู้ว่า การสร้างโฟลเดอร์ด้วยตนเองใน windows และย้ายโฟลเดอร์ ".git" ภายใต้โฟลเดอร์ราก .. จะทำงานได้โดยไม่ส่งผลกระทบต่อประวัติหรือไม่
LP13

2
@ user3862378 ไม่มีเหตุผลที่ไม่ควร .git/มีประวัติทั้งหมดซึ่งรวมถึงการกระทำล่าสุดของคุณ ไม่ว่าคุณจะวางไว้ที่ไหนคุณมีประวัติทั้งหมด ในความเป็นจริงถ้าไฟล์ทั้งหมดในไดเร็กทอรีนั้นแตกต่างจาก repo ดั้งเดิมที่คุณเอา.git/มาสิ่งเดียวก็คือมันจะบอกคุณว่าไฟล์บางไฟล์ถูกลบและมีไฟล์ที่ไม่ได้ติดตามอยู่ ด้วยgit reset --hardไฟล์ที่ถูกลบจะถูกกู้คืนโดยอัตโนมัติ! สิ่งเดียวที่ควรทราบก็คือการคัดลอก.git/คุณจะไม่สามารถกู้คืนการเปลี่ยนแปลงที่ไม่ได้ผูกมัดได้
Shahbaz

6

มันง่ายกว่านั้นด้วยซ้ำ เพิ่งทำสิ่งนี้ (บน Windows แต่ควรทำงานบนระบบปฏิบัติการอื่น):

  1. สร้างnewrepo
  2. ย้ายgitrepo1เข้าnewrepo
  3. ย้าย . gitจากgitrepo1ไปยังnewrepo (ขึ้นหนึ่งระดับ)
  4. ยอมรับการเปลี่ยนแปลง (แก้ไขการติดตามตามต้องการ)

Git เพิ่งเห็นว่าคุณเพิ่มไดเร็กทอรีและเปลี่ยนชื่อไฟล์จำนวนมาก ไม่มี biggie.


สำหรับฉันสิ่งนี้ดูเหมือนจะเป็นคำตอบที่เหมาะสม (ไม่ได้นำไปสู่การสูญเสียประวัติคอมไพล์ซึ่งแตกต่างจากคำตอบที่ยอมรับ)
Marses

2
@ มาร์เซส: Tnx. (ฉันยังไม่อยากจะเชื่อเลยว่าฉันตอบคำถามคอมไพล์แล้ว!)
david.pfx

5

มันสายไปหน่อยและคำถามได้รับคำตอบแล้ว แต่หากต้องการทำโดยไม่ต้องปวดหัว:

  1. ตรวจสอบสาขาปัจจุบันที่คุณอยู่ในโฟลเดอร์ git รุ่นเก่าที่มีการพัฒนาgit statusสาขา
  2. เปลี่ยนไดเร็กทอรีไปที่โฟลเดอร์ git ใหม่จากนั้นgit cloneโปรเจ็กต์จาก repo ไปยังโฟลเดอร์ใหม่
  3. ชำระเงินสาขาปัจจุบันในโฟลเดอร์ใหม่ของคุณ: git checkout development
  4. syncronize โฟลเดอร์ใหม่ของคุณกับคนที่มีอายุมากกว่าใช้rsync, ไม่รวมโฟลเดอร์ .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

ถ้าอย่างนั้นคุณก็ทำต่อจากจุดที่คุณค้างไว้ได้ดี


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