การย้ายเนื้อหาที่เก็บ Git ไปยังที่เก็บอื่นที่รักษาประวัติ


153

ฉันพยายามย้ายเฉพาะเนื้อหาของที่เก็บหนึ่ง ( repo1) ไปยังที่เก็บอื่นที่มีอยู่ ( repo2) โดยใช้คำสั่งต่อไปนี้:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

แต่มันไม่ทำงาน ฉันตรวจสอบโพสต์ที่คล้ายกัน แต่ฉันพบว่ามีเพียงรายการเดียวที่ย้ายโฟลเดอร์ไม่ใช่เนื้อหา


คุณต้องการให้เนื้อหาของ repo1 เป็นสาขาบน repo2 หรือเป็นส่วนหนึ่งของ master ดังนั้นโฟลเดอร์ของ repos ทั้งสองจึงอยู่ร่วมกันในเจ้าหน้าที่ที่ทำงานของคุณหรือไม่?
โครเนียล

ฉันต้องการย้ายมันเป็นส่วนหนึ่งของมาสเตอร์
Mario

4
บทช่วยสอนนี้สมบูรณ์แบบ! smashingmagazine.com/2014/05/19/…
xpto

คำตอบ:


259

ฉันคิดว่าคำสั่งที่คุณกำลังมองหาคือ:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

หลังจากนั้นrepo2/masterจะมีทุกอย่างจากrepo2/masterและrepo1/masterและยังมีประวัติของทั้งคู่


ขอบคุณ Chronial ฉันแค่ต้องการให้แน่ใจว่า repo1 มีสาขาเดียวและจะทำอย่างไรถ้าฉันต้องการย้ายสาขานั้นไปที่ repo2 ด้วย
Mario

repo2 มีสาขาที่สองด้วยหรือไม่? หรือสาขานั้นน่าจะเกิดอะไรขึ้น?
โครเนียล

1
โครเนียลคำสั่งข้างต้นใช้ไม่ได้! มันไม่ได้คัดลอกประวัติ
Mario

1
ตกลงตอนนี้ใช้งานได้แล้ว ฉันใช้คำสั่งต่อไปนี้ cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda วิธีแก้ปัญหาที่ง่ายที่สุดคือเพียงแค่ย้ายทุกอย่างเข้าไปrepo1ในโฟลเดอร์ย่อย (ด้านในrepo1) ก่อนที่คุณจะทำการผสาน
โครเนียล

63

อธิบายอย่างสมบูรณ์ที่นี่https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

ขั้นแรกเราต้องดึงข้อมูลสาขาและแท็กระยะไกลทั้งหมดจากที่เก็บที่มีอยู่ไปยังดัชนีท้องถิ่นของเรา:

git fetch origin

เราสามารถตรวจสอบสาขาที่ขาดหายไปซึ่งเราจำเป็นต้องสร้างสำเนาภายในเครื่อง:

git branch -a

มาใช้ URL ที่โคลน SSH ของที่เก็บใหม่ของเราเพื่อสร้างรีโมตใหม่ในที่เก็บโลคัลที่มีอยู่ของเรา:

git remote add new-origin git@github.com:manakor/manascope.git

ตอนนี้เราพร้อมที่จะผลักดันสาขาและแท็กในพื้นที่ทั้งหมดไปยังรีโมตใหม่ที่ชื่อว่า new-origin:

git push --all new-origin 
git push --tags new-origin

มาสร้างรีโมตเริ่มต้นใหม่:

git remote rm origin

เปลี่ยนชื่อ new-origin เป็นแค่ origin เพื่อให้มันกลายเป็นรีโมตเริ่มต้น:

git remote rename new-origin origin

4
สามารถยืนยันได้ว่านี่คัดลอกประวัติและแท็กทั้งหมด ดีมาก. ขอบคุณ.
Alex

หากต้นกำเนิดใหม่ไม่มีข้อผูกมัดใด ๆ ก็จะทำงานได้ดี อย่างไรก็ตามหากมีการกระทำใด ๆ ในแหล่งกำเนิดใหม่วิธีที่กล่าวถึงในที่นี้จะไม่เป็นไปตามที่คาดไว้
caot

คุณต้อง swtich git checkout BranchNamebranch จากนั้นกด branch ไปที่ remote repo อีกครั้งด้วยgit push --all new-origin แต่ขอบคุณมาก
Raad Altaie

25

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

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

ตอนนี้สมมติว่าคุณต้องการให้ repos ต้นทางและปลายทางซิงค์กันเป็นระยะเวลาหนึ่ง ตัวอย่างเช่นยังคงมีกิจกรรมภายใน repo ระยะไกลปัจจุบันที่คุณต้องการนำไปยัง repo ใหม่ / ทดแทน

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

หากต้องการดึงการอัปเดตล่าสุดลง (สมมติว่าคุณไม่มีการเปลี่ยนแปลงในเครื่อง):

git checkout {branch(es) of interest}
git pull old
git push --all new

หมายเหตุ: ฉันยังไม่ได้ใช้โมดูลย่อยดังนั้นฉันไม่รู้ว่าจะต้องมีขั้นตอนเพิ่มเติมอะไรบ้างหากคุณมี


1
สิ่งนี้ทำงานได้อย่างเรียบง่ายและสะดวกสำหรับฉัน ฉันคิดว่ามันควรจะเป็นคำตอบที่ถูกตรวจสอบ หากคุณมี 60 สาขานี่คือวิธีที่จะไป
rickfoosusa

8

วิธีนี้ได้ผลเพื่อย้าย repo ในพื้นที่ของฉัน (รวมถึงประวัติ) ไปยัง repo github.com ระยะไกลของฉัน หลังจากสร้าง repo ว่างใหม่ที่ GitHub.com ฉันใช้ URL ในขั้นตอนที่สามด้านล่างและใช้งานได้ดี

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

ฉันพบสิ่งนี้ที่: https://gist.github.com/niksumeiko/8972566


1
นี่เป็นวิธีที่ง่ายที่สุดในการปล่อยให้ที่เก็บดั้งเดิม นอกจากนี้ยังคัดลอกสาขาทั้งหมด
Guillermo

1
นอกจากนี้ยังคัดลอกแท็กทั้งหมด
กา

8

วิธีที่ง่ายที่สุดหาก Git ติดตามโค้ดแล้วให้ตั้งค่าที่เก็บใหม่เป็น "ต้นทาง" ของคุณเพื่อส่งไป

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

2

ฉันใช้วิธีการด้านล่างเพื่อย้าย GIT Stash ของฉันไปยัง GitLab โดยการดูแลสาขาทั้งหมดและประวัติการคอมมิต

โคลนที่เก็บเก่าเป็นโลคัล

git clone --bare <STASH-URL>

สร้างที่เก็บว่างใน GitLab

git push --mirror <GitLab-URL>

1

ดูเหมือนว่าคุณจะใกล้ สมมติว่าการส่งของคุณไม่ใช่แค่การพิมพ์ผิดขั้นตอนที่ 3 ควรเป็นcd repo2แทนที่จะเป็น repo1 และขั้นตอนที่ 6 ไม่ควรgit pullผลักดัน รายการที่ทำใหม่:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

ขอบคุณ Eric แต่ในขั้นตอนที่ 3 ฉันต้องการลบลิงก์ของที่เก็บต้นฉบับเพื่อหลีกเลี่ยงการเปลี่ยนแปลงระยะไกลใด ๆ .. เนื่องจากฉันต้องการย้ายเนื้อหาจาก repo1 ไปยัง repo2
Mario

ได้เลย ฉันได้แก้ไขคำตอบของฉันเพื่อพยายามสะท้อนสิ่งนั้น เพื่อให้แน่ใจว่าคุณกำลังพยายามสร้างที่เก็บ repo2 ซึ่งเป็นสำเนาของ repo1 แต่ไม่ได้เก็บ repo1 หรือต้นทางไว้เป็นรีโมท?
Eric Palace

ไม่ฉันไม่ได้พยายามสร้าง repo ใหม่ "repo2" อันที่จริงฉันมี repo2 ที่มีอยู่ซึ่งมีการเริ่มต้นเนื้อหาอื่น ตอนนี้ฉันต้องการย้ายเนื้อหา repo1 ทั้งหมดไปยัง repo2 พร้อมประวัติ ฉันจะทำให้ repo1 ว่างเปล่าเหมือนที่อยู่ในเซิร์ฟเวอร์
Mario

คุณคิดว่าจะไม่ใช้คอมไพล์หรือไม่? ดูเหมือนว่าคุณอาจแค่คัดลอกไฟล์ (ผ่าน gui หรือ scp หรือ ftp) แล้วเพิ่มลงใน git repo ของคุณด้วยตนเอง อาจไม่มีประสิทธิภาพเท่าไหร่ แต่ก็น่าจะง่ายกว่า
Eric Palace

ฉันลองแล้ว แต่มันทิ้งประวัติไว้ ฉันต้องการย้ายประวัติทั้งหมดด้วยเช่นกัน
Mario

1

ตามที่ @ Dan-Cohn ตอบ Mirror-push คือเพื่อนของคุณที่นี่ นี่คือสิ่งที่ฉันไปเพื่อย้าย repos:

การมิเรอร์ที่เก็บ

1. เปิด Git Bash

2. สร้างโคลนเปล่าของที่เก็บ

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.Mirror-push ไปยังที่เก็บใหม่

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4. ลบที่เก็บในเครื่องชั่วคราวที่คุณสร้างไว้ในขั้นตอนที่ 1

$ cd ..
$ rm -rf old-repository.git

ข้อมูลอ้างอิงและเครดิต: https://help.github.com/en/articles/duplicating-a-repository


-1

มีคำตอบที่ซับซ้อนมากมายที่นี่ อย่างไรก็ตามหากคุณไม่เกี่ยวข้องกับการเก็บรักษาสาขาสิ่งที่คุณต้องทำคือรีเซ็ตจุดเริ่มต้นระยะไกลตั้งค่าต้นน้ำและพุช

สิ่งนี้ได้ผลเพื่อรักษาประวัติการกระทำทั้งหมดสำหรับฉัน

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.