วิธีย้ายที่เก็บ GIT จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์ใหม่


263

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


ข้อมูลทั้งหมด (orgin, trunk, ฯลฯ ) เกี่ยวกับพื้นที่เก็บข้อมูลจะถูกเก็บไว้ในโฟลเดอร์ชื่อ '.git' ซึ่งคุณจะเริ่มต้นพื้นที่เก็บข้อมูล ดังนั้นคุณต้องคัดลอกเนื้อหาไปยังเซิร์ฟเวอร์ใหม่โดยใช้คำแนะนำที่ให้ไว้ที่นี่
Mansab Uppal

1
เพียงแค่คอมไพล์ config remote.origin.url newurl ดูstackoverflow.com/questions/3011402/…
Niels

1
หากคุณต้องการโยกย้าย repo ของคุณและทุกสาขาใช้คำตอบโดย jzwiener หรือ Roberto มากกว่าคำตอบที่ยอมรับ
jonaglon

คำตอบ:


247

ในการเพิ่มที่ตั้ง repo ใหม่

git remote add new_repo_name new_repo_url

จากนั้นดันเนื้อหาไปยังตำแหน่งใหม่

git push new_repo_name master

ในที่สุดก็เอาอันเก่าออก

git remote rm origin

หลังจากนั้นคุณสามารถทำสิ่งที่ bdonlan พูดและแก้ไขไฟล์. git / config เพื่อเปลี่ยน new_repo_name เป็น Origin หากคุณไม่ลบต้นกำเนิด (ที่เก็บรีโมตดั้งเดิม) คุณสามารถเพียงแค่ผลักดันการเปลี่ยนแปลงไปยัง repo ใหม่ด้วย

git push new_repo_name master

8
นี่จะเป็นการคัดลอกสาขาเดียวจากที่เก็บเก่าไปยังสาขาใหม่หรือไม่?
แอนดรูกริมม์

34
ทางออกในการโยกย้ายสาขาทั้งหมดคืออะไร?
emmby

50
git push -u new_repo_name --allคุณควรจะสามารถที่จะผลักดันสาขาทั้งหมดในครั้งเดียวผ่าน
rmarscher

10
การย้ายถิ่นของทุกสาขาสามารถดูได้ที่stackoverflow.com/a/18336145/923599
jzwiener

10
แทนที่จะแก้ไขไฟล์ git-config คำสั่งนี้ใช้งานได้สำหรับฉัน:git remote rename new_repo_name origin
30816 Salim

210

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

git clone --mirror [oldUrl]

เพื่อโคลน repo เก่ากับทุกสาขา

cd the_repo
git remote add remoteName newRepoUrl

เพื่อตั้งค่ารีโมตใหม่

git push -f --tags remoteName refs/heads/*:refs/heads/*

เพื่อผลักดันการอ้างอิงทั้งหมดภายใต้การอ้างอิง / หัว (ซึ่งอาจเป็นสิ่งที่คุณต้องการ)


5
Git ถูกบ่นว่า--tagsและไม่ได้เข้ากันได้กับrefs/heads/*:refs/heads/* stackoverflow.com/a/26552740/1484831ทำงานได้ดี --mirror
Avigit

3
ฉันใช้มันและมันก็ได้ผลกับฉัน น่าจะเป็นคำตอบที่ได้รับการเลือกตั้ง โปรดทราบว่า "รหัส" ที่คุณได้รับภายในเครื่องนั้นดูเหมือนจะหนักกับข้อมูลเมตาซึ่งทำให้ไม่ชัดเจนสำหรับมือใหม่หากมีสิ่งผิดปกติ
กรงขัง

3
นี่ควรเป็นคำตอบที่ได้รับการอนุมัติ ดีกว่าโซลูชันอื่น ๆ
Travis Griggs

15
ฉันลงเอยด้วยกิ่งไม้ทั้งหมดในที่เก็บรีโมตใหม่ของฉันซึ่งนำหน้าrefs/heads/refs/headsด้วยการใช้git push -f --tags remoteName refs/heads/*:refs/heads/*ดังนั้นฉันจึงเปลี่ยนไปgit push remoteName --mirror
dumbledad

1
push--mirrorนอกจากนี้ยังสนับสนุน git clone --mirror; cd repo; git push --mirror new_remoteควรทำเคล็ดลับ
knittl

143

นี้ทำงานสำหรับฉันไม่มีที่ติ

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

ฉันต้องพูดถึงแม้ว่าสิ่งนี้จะสร้างภาพสะท้อนของ repo ปัจจุบันของคุณแล้วผลักมันไปยังตำแหน่งใหม่ ดังนั้นนี้สามารถใช้เวลาบางอย่างสำหรับ Repos ขนาดใหญ่หรือการเชื่อมต่อช้า


15
*** อันนี้ ***
Paul Lockwood

1
นี่เป็นทางออกที่ดีที่ให้กำเนิดแหล่ง URL ระยะไกล <URL ไปยังตำแหน่ง repo ใหม่ของฉัน> (หลังจาก rsync'ed ต้นกำเนิดเก่าไปยังเซิร์ฟเวอร์ / ตำแหน่งใหม่)
Toni Homedes i Saun

2
อันนี้ยอดเยี่ยมมาก ไม่มีความสับสนหลายรีโมท
TaoPR

16
ชอบมากกว่าgit push --mirror origin -f
Aidiakapi

78

คัดลอกมัน มันง่ายจริงๆ :)

ทางฝั่งไคลเอ็นต์เพียงแก้ไข. git / config ใน repo ในพื้นที่ของลูกค้าเพื่อชี้รีโมตของคุณไปยัง URL ใหม่ตามความจำเป็น


6
คุณสามารถโคลนได้ง่ายๆ นอกจากนี้แทนที่จะแก้ไขไฟล์. git / config โดยตรงคุณสามารถใช้ git remote rm origin; git remote add origin <แหล่งเก็บข้อมูลใหม่>
ebneter

4
การรีโมตรีโมตจะสูญเสียการกำหนดค่าใด ๆ ภายใต้ส่วนของการกำหนดค่า - และการโคลนโดยไม่ต้องทำตามขั้นตอนพิเศษใด ๆ จะสูญเสียสาขาอื่น ๆ ยกเว้นลำต้น เป็นไปได้ที่จะจัดการกับปัญหาเหล่านี้ แต่จริงๆ - เพียงแค่ซิงค์มัน
bdonlan

1
อะไรคือทางออกของการใช้คอมไพล์เพียงอย่างเดียวในการทำงาน? rsync ต้องใช้ห่วงการบริหารเพิ่มเติมที่ยากที่จะข้ามผ่าน
emmby

2
สิ่งนี้ยังคงรักษาไว้เช่น hooks และการกำหนดค่าอื่น ๆ ดังนั้นฉันจึงชอบที่จะแก้ปัญหา git อย่างแท้จริง
mnagel

65

นี่เป็นส่วนหนึ่งของคำตอบอื่น ๆ

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

6
นี่คือความจริงแล้วคำตอบที่ตรงไปตรงมาที่สุด
Lawrence Dol

3
--mirrorในการผลักดันเป็นสิ่งสำคัญมาก: นี่ควรเป็นคำตอบที่ถูกต้อง
PaoloC

เมื่อคุณเริ่มต้นพื้นที่เก็บข้อมูลใหม่บนเซิร์ฟเวอร์ใหม่อย่าลืมทำ init ไม่เช่นนั้นการพุชจะไม่สำเร็จ:git init --bare
marco

35

ฉันเพิ่งโพสต์สิ่งที่คนอื่นพูดในรายการคำแนะนำง่ายๆ

  1. ย้ายที่เก็บ:เพียงเข้าสู่เซิร์ฟเวอร์ใหม่cdไปยังไดเรกทอรีหลักที่คุณต้องการเก็บที่เก็บและใช้rsyncเพื่อคัดลอกจากเซิร์ฟเวอร์เก่า:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. ทำให้ไคลเอ็นต์ชี้ไปที่ที่เก็บใหม่:ตอนนี้บนแต่ละไคลเอ็นต์ที่ใช้ที่เก็บเพียงแค่ลบตัวชี้ไปยังจุดเริ่มต้นเก่าและเพิ่มหนึ่งไปยังที่เก็บใหม่

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

ง่ายและมีประสิทธิภาพ คุณสามารถเพิ่มการตั้งค่าสถานะ --bwlimit = XXX หากคุณต้องการ จำกัด การรับส่งข้อมูลระหว่างเซิร์ฟเวอร์โดยที่ XXX เท่ากับแบนด์วิดท์เป็น KBytes ต่อวินาที
Greg Glockner

7
บิตดีกว่าลบและเพิ่ม:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL

สำหรับผู้ที่ปรับใช้เซิร์ฟเวอร์โดยใช้ git + capistrano โปรดทราบว่าฉันต้องใช้ set-url origin ใน 2 แห่ง: บน localhost และบน cached-copy ที่อยู่บนเซิร์ฟเวอร์
anandvc


10

ฉันทำตามคำแนะนำบน BitBucket เพื่อย้าย repo ที่มีสาขาทั้งหมดที่นั่น ต่อไปนี้เป็นขั้นตอนที่มีคำอธิบายตาม#ตัวละคร:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://git@bitbucket.org/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

ทำงานได้ดีสำหรับฉัน


8

กรุณาทำตามขั้นตอน:

  • git remote เพิ่มแหล่งกำเนิดใหม่
  • git push - ทั้งหมดที่มาใหม่
  • git push - แท็กเริ่มต้นใหม่
  • git กำเนิด rm ระยะไกล
  • git เปลี่ยนชื่อจากระยะไกลต้นกำเนิดใหม่

5

นี่เป็นรูปแบบของคำตอบนี้ซึ่งปัจจุบันแนะนำโดยgitlabเพื่อ "โอนย้าย" ที่เก็บ git จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่น

  1. ให้เราสมมติว่าโครงการเก่าของคุณถูกเรียกexisting_repoเก็บไว้ในexisting_repoโฟลเดอร์

  2. สร้าง repo บนเซิร์ฟเวอร์ใหม่ของคุณ เราจะสมมติว่า URL ของโครงการใหม่นั้นคือgit@newserver:newproject.git

  3. เปิดอินเตอร์เฟสบรรทัดคำสั่งและป้อนต่อไปนี้:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

ประโยชน์ของวิธีนี้คือคุณไม่ต้องลบสาขาที่สอดคล้องกับเซิร์ฟเวอร์เก่าของคุณ


4

คุณสามารถใช้คำสั่งต่อไปนี้:

git remote set-url --push origin new_repo_url

ตัวอย่างจากhttp://gitref.org/remotes/

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

ควรง่ายเหมือน:

git remote set-url origin git://new.url.here

วิธีนี้ทำให้คุณเก็บชื่อoriginrepo ใหม่ของคุณ - จากนั้นกดไปที่ repo ใหม่อันเก่าตามรายละเอียดในคำตอบอื่น ๆ หากว่าคุณทำงานคนเดียวและคุณมี repo ท้องถิ่นที่คุณต้องการสะท้อนกับ cruft ทั้งหมดของคุณคุณก็อาจจะ (เช่นภายใน repo ท้องถิ่นของคุณ)

git push origin --mirror # origin points to your new repo

แต่ดูว่า"git push --mirror" เพียงพอสำหรับการสำรองที่เก็บของฉันหรือไม่ (ในทั้งหมดไม่ได้ใช้--mirrorแต่ครั้งเดียว)


3

ทำตามคำแนะนำเหล่านี้หากคุณต้องการที่จะรักษาคอมมิชชันและสาขาทั้งหมดจากเก่าไปสู่ ​​repo ใหม่

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>


1

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

  1. ก่อนอื่นให้ไปที่โฟลเดอร์ (git) ในเครื่องที่คุณต้องการย้าย
  2. สร้างที่เก็บใหม่ออนไลน์ขั้นตอนนี้สร้างที่เก็บซึ่งเราสามารถส่งรหัสไป

ตอนนี้ในโฟลเดอร์ทำ

git remote get-url origin

คำสั่งดังกล่าวให้ URL แหล่งกำเนิดระยะไกลปัจจุบันมีประโยชน์ในการตั้งค่าต้นกำเนิดกลับไปในขั้นตอนสุดท้าย

git remote set-url origin git@github.newlocation:folder/newrepo.git

คำสั่งดังกล่าวตั้งค่าที่มาจากระยะไกลไปยังตำแหน่งใหม่

git push --set-upstream origin develop

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

git remote set-url origin <original old origin>

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

หวังว่าจะช่วยได้


0

หากคุณต้องการโอนย้ายที่เก็บ #git จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์ใหม่คุณสามารถทำได้ดังนี้:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

กิ่งก้านและแท็กรีโมตทั้งหมดจากที่เก็บเก่าจะถูกคัดลอกไปยังที่เก็บใหม่

รันคำสั่งนี้เพียงอย่างเดียว:

git push NEW_REPOSITORY_ALIAS

จะคัดลอกสาขาหลัก (เฉพาะการติดตามสาขา) ไปยังที่เก็บใหม่

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