Git mendorong repo yang ada ke server repo jarak jauh yang baru dan berbeda?


494

Katakanlah saya memiliki repositori di git.fedorahosted.org dan saya ingin mengkloning ini ke akun saya di github untuk memiliki taman bermain sendiri selain dari repo yang lebih "resmi" di fedorahosted. Apa langkah-langkah awal menyalin itu? Di dalam github ada tombol "garpu" yang bagus, tapi saya tidak bisa menggunakan ini karena alasan yang jelas.

Dan bagaimana saya melacak perubahan di repo fedorahosted ke dalam github?

Jawaban:


751
  1. Buat repo baru di github.
  2. Kloning repo dari fedorahosted ke mesin lokal Anda.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Sekarang Anda dapat bekerja dengannya sama seperti repo github lainnya. Untuk menarik tambalan dari hulu, jalankan saja git pull upstream master && git push origin master.


14
Tidak ada alasan untuk mengganti nama aslinya, panggil saja tempat bermain yang baru itu sesuatu yang lain.
tacaswell

34
@tcaswell Secara teknis tidak, tetapi ini adalah konvensi yang kuat yang originmenunjuk ke lokasi terpencil kanonik. Dalam hal ini, lokasi github mungkin akan menjadi kanonik.
troelskn

1
Saya akan menganggap 'hulu' sebagai lokasi kanonik, tapi saya pikir ini mulai membelah rambut.
tacaswell

3
Mungkin saya harus memposting pertanyaan yang berbeda tapi saya pikir kalian sedang mendiskusikan apa yang saya inginkan. Saya ingin menambahkan remote baru, bukan mengganti yang sudah ada sehingga saya bisa terus menarik dari repositori lama tetapi mendorong perubahan apa pun ke yang baru.
ThatAintWorking

13
@ThatAintWorking Anda mungkin harus membuka pertanyaan baru, tetapi singkatnya - Anda dapat menambahkan sejumlah remote dengan perintah git remote add. Anda kemudian dapat mendorong ke salah satu dari mereka dengan secara eksplisit menyatakan remote git push. Misalnya git push foobar masteruntuk mendorong cabang saat ini ke masterjarak jauh foobar.
troelskn

108

Ada jawaban yang dihapus pada pertanyaan ini yang memiliki tautan bermanfaat: https://help.github.com/articles/duplicating-a-repository

Intinya adalah

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

Contoh OP:

Di mesin lokal Anda

$ 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
Apa manfaat dari clone telanjang dan mirror push over hanya dengan menambahkan dan mendorong ke remote lain? Apakah semua cabang akan didorong dan bukan hanya cabang saat ini? (Jika demikian, sepertinya ini adalah batasan dari jawaban yang diterima yang harus dicatat.)
yoyo

3
Ini persis info yang saya cari, --bare / --mirror biasanya yang ingin dilakukan orang! Ini jawaban yang penting! Terima kasih
claf

1
Bagus! Jawaban yang paling benar pada pertanyaan topik. Terima kasih! Jika saya tidak melakukannya seperti ini, saya selalu mendapatkanerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin

45

Untuk mendorong repo yang ada ke yang berbeda, Anda perlu:

  1. Kloning repo asli terlebih dahulu.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Dorong sumber yang dikloning ke repositori baru Anda:

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

Anda dapat berubah master:mastermenjadi source:destinationcabang.


Jika Anda ingin mendorong komit tertentu (cabang), maka lakukan:

  1. Pada repo asli, buat dan checkout cabang baru:

    git checkout -b new_branch
    
  2. Pilih dan setel ulang ke titik yang ingin Anda mulai:

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

    Atau pilih komit oleh git cherry-pickuntuk menambahkan ke KEPALA yang ada.

  3. Kemudian dorong ke repo baru Anda:

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

    Jika Anda rebasing, gunakan -funtuk push force (tidak disarankan). Jalankan git refloguntuk melihat riwayat perubahan.


2
yang git push ... old_branch_name:new_branch_namememungkinkan Anda untuk mendorong cabang fitur dari repositori tua sebagai cabang utama di repositori baru. Berguna!
gorjanz

Ini adalah cara paling sederhana bagi saya untuk melakukannya.
Adam

15

Apakah Anda benar-benar ingin hanya mendorong repositori lokal Anda (dengan cabang lokalnya, dll.) Ke remote baru atau apakah Anda benar-benar ingin mirror remote lama (dengan semua cabang, tag, dll) pada remote baru? Jika yang terakhir ini adalah blog yang bagus tentang Cara merefleksikan repositori git dengan benar .

Saya sangat menyarankan Anda untuk membaca blog untuk beberapa detail yang sangat penting, tetapi versi singkatnya adalah ini:

Di direktori baru jalankan perintah ini:

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

Saya pikir ini adalah tautannya: blog.plataformatec.com.br/2013/05/...
David

11

Coba ini Cara memindahkan repositori Git lengkap

  1. Buat repositori lokal di direktori temp-dir menggunakan:

    git clone temp-dir

  2. Buka direktori temp-dir.

  3. Untuk melihat daftar cabang berbeda di ORI lakukan:

    git branch -a
    
  4. Periksa semua cabang yang ingin Anda salin dari ORI ke BARU menggunakan:

    git checkout branch-name
    
  5. Sekarang ambil semua tag dari ORI menggunakan:

    git fetch --tags
    
  6. Sebelum melakukan langkah selanjutnya pastikan untuk memeriksa tag dan cabang lokal Anda menggunakan perintah berikut:

    git tag
    
    
    git branch -a
    
  7. Sekarang hapus tautan ke repositori ORI dengan perintah berikut:

    git remote rm origin
    
  8. Sekarang, tautkan repositori lokal Anda ke repositori BARU yang baru dibuat menggunakan perintah berikut:

    git remote add origin <url to NEW repo>
    
  9. Sekarang dorong semua cabang dan tag Anda dengan perintah ini:

    git push origin --all
    
    
    git push --tags
    
  10. Anda sekarang memiliki salinan lengkap dari repo ORI Anda.


9

Saya menemukan solusi menggunakan set-url yang ringkas dan cukup mudah dimengerti :

  1. buat repo baru di Github
  2. cd ke dalam repositori yang ada di mesin lokal Anda (jika Anda belum mengkloningnya, maka lakukan ini dulu)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master

9

Jika Anda memiliki repositori Git yang Ada:

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
Hanya untuk memperjelas, --semua akan mendorong semua cabang
GilCol

7

Cukup arahkan repo baru dengan mengubah URL repo GIT dengan perintah ini:

git remote set-url origin [new repo URL]

Contoh: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

Sekarang, mendorong dan menarik terkait dengan REPO baru.

Kemudian dorong seperti biasa:

git push -u origin master

2

Saya memiliki masalah yang sama.

Dalam kasus saya, karena saya memiliki repositori asli di mesin lokal saya, saya telah membuat salinan di folder baru tanpa ada file tersembunyi (.git, .gitignore).

Akhirnya saya menambahkan file .gitignore ke folder yang baru dibuat.

Kemudian saya telah membuat dan menambahkan repositori baru dari jalur lokal (dalam kasus saya menggunakan GitHub Desktop).


1

Ini adalah cara manual untuk melakukannya git remote set-url origin [new repo URL]:

  1. Kloning repositori: git clone <old remote>
  2. Buat repositori GitHub
  3. Buka <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
    

    dan ubah remote (opsi url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Dorong repositori ke GitHub: git push

Anda juga dapat menggunakan keduanya / beberapa remote .


Saya mencari masalah yang sama dan kemudian melakukan hal yang sama dan berhasil.
Mohit Patidar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.