Git ผลักดัน repo ที่มีอยู่ไปยังเซิร์ฟเวอร์ repo ระยะไกลใหม่และแตกต่างกันอย่างไร


494

ว่าฉันมีพื้นที่เก็บข้อมูลในgit.fedorahosted.orgและฉันต้องการโคลนนี้ในบัญชีของฉันที่ github เพื่อให้มีสนามเด็กเล่นของตัวเองนอกเหนือจาก repo "เป็นทางการ" มากขึ้นใน fedorahosted ขั้นตอนในการคัดลอกเริ่มแรกนั้นจะเป็นอย่างไร? ภายใน GitHub มีปุ่ม "fork" ที่ดี แต่ฉันไม่สามารถใช้สิ่งนี้ได้ด้วยเหตุผลที่ชัดเจน

และฉันจะติดตามการเปลี่ยนแปลงของ repo ที่ได้รับ fedorahosted เข้าสู่ gitub ได้อย่างไร?

คำตอบ:


751
  1. สร้าง repo ใหม่ที่ github
  2. ลอกแบบ repo จาก fedorahosted ไปยังเครื่องของคุณ
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

ตอนนี้คุณสามารถทำงานกับมันได้เช่นเดียวกับ repo GitHub อื่น ๆ git pull upstream master && git push origin masterในการดึงแพทช์ตั้งแต่ต้นน้ำวิ่งเพียง


14
ไม่มีเหตุผลที่จะเปลี่ยนชื่อต้นกำเนิดดั้งเดิมเพียงแค่เรียกสิ่งใหม่ ๆ
tacaswell

34
@tcaswell ไม่มีทางเทคนิค แต่เป็นระเบียบที่แข็งแกร่งที่originชี้ไปยังสถานที่ห่างไกลที่ยอมรับ ในกรณีนี้ตำแหน่ง Github น่าจะเป็นที่ยอมรับ
troelskn

1
ฉันคิดว่า 'อัพสตรีม' เป็นตำแหน่งที่ยอมรับ แต่ฉันคิดว่านี่เริ่มแยกผมออก
tacaswell

3
บางทีฉันควรโพสต์คำถามอื่น แต่ฉันคิดว่าพวกคุณกำลังคุยกันเรื่องที่ฉันต้องการ ฉันต้องการเพิ่มรีโมตใหม่ไม่ได้แทนที่รีโมตใหม่ดังนั้นฉันสามารถดึงจากที่เก็บเก่าต่อไป แต่ดันการเปลี่ยนแปลงใด ๆ ไปยังรีโมตใหม่
ThatAintWorking

13
@ThatAintWorking คุณอาจเปิดคำถามใหม่ แต่โดยย่อคุณสามารถเพิ่มจำนวนรีโมทด้วยคำสั่งgit remote addได้ git pushจากนั้นคุณสามารถผลักดันให้เป็นหนึ่งในพวกเขาโดยระบุชัดเจนในระยะไกล เช่นgit push foobar masterที่จะผลักดันสาขาปัจจุบันไปในระยะไกลmaster foobar
troelskn

108

มีคำตอบที่ถูกลบสำหรับคำถามนี้ที่มีลิงค์ที่มีประโยชน์: https://help.github.com/articles/duplicating-a-repository

ส่วนสำคัญคือ

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location

ตัวอย่างของ OP:

บนเครื่องท้องถิ่นของคุณ

$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git

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

3
นี่เป็นข้อมูลที่ฉันต้องการอย่างแน่นอน - thebare / --mirror มักเป็นสิ่งที่ผู้คนต้องการแสดง! นี่คือคำตอบที่สำคัญ! ขอบคุณ
claf

1
ที่ดี! คำตอบที่ถูกต้องที่สุดสำหรับคำถามหัวข้อ ขอบคุณ! หากฉันไม่ทำเช่นนี้ฉันจะได้รับเสมอerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin

45

หากต้องการผลักดัน repo ที่มีอยู่ให้แตกต่างกันคุณจะต้อง:

  1. ลอกเลียนแบบ repo ดั้งเดิมก่อน

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. พุชแหล่งที่มาโคลนไปยังที่เก็บใหม่ของคุณ:

    cd rhq
    git push https://github.com/user/example master:master
    

คุณสามารถเปลี่ยนmaster:masterเป็นsource:destinationสาขา


หากคุณต้องการที่จะผลักดันการกระทำที่เฉพาะเจาะจง (สาขา) แล้วทำ:

  1. ใน repo ดั้งเดิมให้สร้างและชำระเงินสาขาใหม่:

    git checkout -b new_branch
    
  2. เลือกและรีเซ็ตเป็นจุดที่คุณต้องการเริ่มต้นด้วย:

    git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    หรือเลือกการกระทำโดยgit cherry-pickเพื่อผนวกเข้ากับ HEAD ที่มีอยู่

  3. จากนั้นกดไปที่ repo ใหม่ของคุณ:

    git push https://github.com/user/example new_branch:master
    

    หากคุณกำลังรีบูตให้ใช้-fแรงกด (ไม่แนะนำ) เรียกใช้git reflogเพื่อดูประวัติการเปลี่ยนแปลง


2
git push ... old_branch_name:new_branch_nameช่วยให้คุณสามารถที่จะผลักดันสาขาคุณลักษณะจากพื้นที่เก็บข้อมูลเก่าเป็นสาขาหลักในที่เก็บใหม่ มีประโยชน์!
gorjanz

นี่เป็นวิธีที่ง่ายที่สุดสำหรับฉันที่จะทำ
Adam

15

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

ฉันขอแนะนำให้คุณอ่านบล็อกสำหรับรายละเอียดที่สำคัญบางอย่าง แต่ฉบับย่อคือ:

ในไดเรกทอรีใหม่ให้รันคำสั่งเหล่านี้:

git clone --mirror git@example.com/upstream-repository.git
cd upstream-repository.git
git push --mirror git@example.com/new-location.git

ฉันคิดว่านี่คือลิงค์: blog.plataformatec.com.br/2013/05/…
เดวิด

11

ลองใช้วิธีย้ายที่เก็บ Git แบบเต็ม

  1. สร้างที่เก็บในเครื่องในไดเรกทอรี temp-dir โดยใช้:

    คอมไพล์ git temp-dir

  2. ไปที่ไดเรกทอรี temp-dir

  3. หากต้องการดูรายการสาขาที่แตกต่างใน ORI ให้ทำดังนี้

    git branch -a
    
  4. ชำระเงินทุกสาขาที่คุณต้องการคัดลอกจาก ORI ไปยัง NEW โดยใช้:

    git checkout branch-name
    
  5. ตอนนี้ดึงแท็กทั้งหมดจาก ORI โดยใช้:

    git fetch --tags
    
  6. ก่อนที่จะทำขั้นตอนต่อไปตรวจสอบให้แน่ใจว่าได้ตรวจสอบแท็กและสาขาในพื้นที่ของคุณโดยใช้คำสั่งต่อไปนี้:

    git tag
    
    
    git branch -a
    
  7. ตอนนี้ล้างลิงก์ไปยังที่เก็บ ORI ด้วยคำสั่งต่อไปนี้:

    git remote rm origin
    
  8. ตอนนี้เชื่อมโยงพื้นที่เก็บข้อมูลในท้องถิ่นของคุณไปยังพื้นที่เก็บข้อมูลใหม่ที่สร้างขึ้นใหม่โดยใช้คำสั่งต่อไปนี้:

    git remote add origin <url to NEW repo>
    
  9. ตอนนี้ดันสาขาและแท็กทั้งหมดของคุณด้วยคำสั่งเหล่านี้:

    git push origin --all
    
    
    git push --tags
    
  10. ตอนนี้คุณมีสำเนาฉบับเต็มจาก repo ORI ของคุณ


9

ฉันพบวิธีแก้ปัญหาโดยใช้set-urlซึ่งรัดกุมและเข้าใจง่าย :

  1. สร้าง repo ใหม่ที่ Github
  2. cd ลงในที่เก็บที่มีอยู่บนเครื่องของคุณ (หากคุณยังไม่ได้ทำการโคลนให้ทำสิ่งนี้ก่อน)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master

9

หากคุณมีที่เก็บ Git ที่มีอยู่:

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/newproject
git push -u origin --all
git push -u origin --tags

1
เพียงเพื่อชี้แจง
GilCol

7

เพียงชี้ repo ใหม่โดยเปลี่ยน URL repo ของ GIT ด้วยคำสั่งนี้:

git remote set-url origin [new repo URL]

ตัวอย่าง: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

ตอนนี้การกดและการดึงจะเชื่อมโยงกับ REPO ใหม่

จากนั้นกดตามปกติดังนี้:

git push -u origin master

2

ฉันมีปัญหาเดียวกัน

ในกรณีของฉันเนื่องจากฉันมีที่เก็บต้นฉบับในเครื่องท้องถิ่นของฉันฉันได้ทำสำเนาในโฟลเดอร์ใหม่โดยไม่มีไฟล์ที่ซ่อนอยู่ (.git, .gitignore)

ในที่สุดฉันได้เพิ่มไฟล์. gitignore ไปยังโฟลเดอร์ที่สร้างขึ้นใหม่

จากนั้นฉันได้สร้างและเพิ่มพื้นที่เก็บข้อมูลใหม่จากเส้นทางท้องถิ่น (ในกรณีของฉันโดยใช้ GitHub Desktop)


1

นี่คือวิธีทำด้วยตนเองgit remote set-url origin [new repo URL]:

  1. โคลนที่เก็บ: git clone <old remote>
  2. สร้างที่เก็บ GitHub
  3. เปิด <repository>/.git/config

    $ git config -e
    
    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = <old remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    และเปลี่ยนรีโมต (ตัวเลือก url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. พุชที่เก็บไปที่ GitHub: git push

นอกจากนี้คุณยังสามารถใช้ทั้ง / หลายรีโมท


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