Bagaimana cara membuat repo GitHub baru dari cabang di repo yang ada?


171

Saya memiliki cabang master dan proyek baru . Dan sekarang saya ingin membuat repo baru dengan masternya berdasarkan cabang proyek baru.

Latar Belakang: Saya punya satu repositori yang berisi tiga aplikasi independen. Itu tidak dimulai dengan cara ini. Awalnya hanya ada satu aplikasi di repo. Namun seiring berjalannya waktu, kebutuhan bisnis telah berubah. Satu aplikasi menjadi dua (versi lawas dan penulisan ulang.) Layanan web ditambahkan. Cabang-cabang terpisah digunakan untuk memuat tiga proyek. Namun, mereka tidak membagikan kode apa pun. Dan jadi akan lebih mudah untuk memecah mereka menjadi repo mereka sendiri.

Jawaban:


294

Saya mulai dengan ide @ user292677, dan memperbaikinya untuk menyelesaikan masalah saya:

  1. Buat repo baru di github.
  2. cd ke salinan lokal dari repo lama yang ingin Anda ekstrak, yang disiapkan untuk melacak cabang proyek baru yang akan menjadi master repo baru .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

Repo Github baru selesai. Hasilnya adalah;

  • repositori Github baru bernama new-repo ,
  • yang mastersesuai dengan proyek baru repo lama , dengan
  • semua sejarah terpelihara.

Bahkan, saya menemukan bahwa dengan menggunakan metode ini, saya dapat membuat repo baru dengan pilihan cabang yang dipilih sendiri, diganti nama sesuai yang saya inginkan:

$ git push git@github.com:accountname/new_repo +new-project:master +site3a:rails3

Hasilnya adalah cabang site3a yang sudah ada sekarang juga dipindahkan ke repo baru dan akan muncul sebagai rails3 . Ini bekerja sangat baik: diagram jaringan menunjukkan master dan rail3 baru dengan sejarah penuh dan dalam hubungan yang benar satu sama lain.

Pembaruan 2013-12-07: Digunakan ini dengan proyek lain, dan diverifikasi bahwa resep ini masih berfungsi.

Pembaruan 2018-01-11: Langkah 3. diperbarui untuk menggunakan rekomendasi GitHub untuk protokol https. Resep masih bekerja.


Hai @ Dweweather, terima kasih sudah berbagi ini. dapatkah Anda menjelaskan apa perbedaan antara metode Anda dan mengubah url remote asal, mendorong ke metode repo baru?
Vincent

5
Dogweather, saya telah menggunakan solusi Anda lebih dari yang bisa saya ingat. Terima kasih! Saya harus checkout old_branch terlebih dahulu sebelum ini bekerja untuk saya
Bjorn Theart

3
perhatikan bahwa ini tidak akan menyalin tag. Saya percaya Anda mungkin perlu --follow-tagsuntuk itu.
Factor Mystic

1
Perhatikan bahwa Anda tidak perlu membuat repo di Github, Anda bisa langsung pushke repo lokal (mis. git initAlih-alih Github> Baru> ...)
OJFord

1
Saya tidak ingin mentransfer semua riwayat komit saya ke repo baru, saya hanya ingin menyalin komit yang termasuk dalam repositori anak. Apakah ini mungkin ??
Arbaz Rizvi

27

Memperbarui:

cd ke repo lokal yang berisi old_branch dan:

$ git push https://github.com/accountname/new_repo.git +old_branch:master

9
git clone -b new-project /path/to/repo /new/repo/path

Sunting: Di dalam GitHub, Anda dapat "garpu" repo, lalu pergi ke tab Admin di klon Anda. Di bawah "Nama repositori" dan "Visibilitas" adalah "Cabang Default" dengan menu tarik-turun cabang. Pilih new-project.

Sunting ulang: Saya baru sadar itu mastercabang yang ingin Anda atur, bukan hanya cabang "default". Begitu…

  • Di GitHub, klon them/repoke you/repo.
  • Lari git clone git@github.com:you/repo.git
  • Mulai gitk.
  • [Anda mungkin ingin membuat old-mastercabang sehingga Anda tidak kehilangan jejak dari komitmen lama.]
  • Temukan komit terbaru di new-projectcabang, klik kanan pada pesan komit, dan pilih "Reset master branch to here". (Anda juga dapat melakukan ini di baris perintah menggunakan git-reset, tapi saya belum menemukan doa yang benar.)

Dorongan Anda berikutnya ke repo GitHub Anda harus dilakukan dengan --forceopsi, tetapi jika tidak, Anda sudah selesai.

Jika itu salah satu repo Anda sendiri, Anda melakukan ini untuk ...

  • Lari git clone git@github.com:you/orig.git
  • Lari git clone orig copy
  • Seperti yang saya jelaskan di atas, tetapi dari dalam copyrepo lokal , setel ulang mastercabang ke tempat yang Anda inginkan.
  • Buat proyek GitHub kosong you/copy. Ikuti petunjuk di GitHub untuk mengatur proyek itu sebagai remote untuk versi lokal Anda copy, dorong master, dan Anda selesai!

Hmm! Saya tidak yakin bagaimana melakukan langkah pertama: kloning repo di dalam github. Saya pikir itu tidak mungkin.
Dogweather

@Dogweather, namanya “forking” di GitHub; Saya telah mengedit jawaban saya untuk kejelasan.
JC Salomon

Saya tidak dapat membayar repo dalam satu akun. Sudahkah Anda mencobanya sendiri?
Dogweather

5
  1. Buat NEW_REPOSITORY di github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

Dan itu saja. (Catatan: git history diawetkan)

Saya telah mencoba jawaban di atas dan menemukan itu tidak cukup spesifik karena tidak menentukan + master: master yang saya butuhkan untuk membuatnya berfungsi. Ini bekerja dengan baik.

Sumber (dengan modifikasi saya untuk menghindari masalah ssh dengan github): Mauricio Aiello, mantan Pengembang Senior Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branch-in-an-repositori yang ada


Itu sebenarnya lebih bermanfaat daripada jawaban yang diterima. Ia bekerja bahkan dalam situasi di mana Git mengeluh tentang kesalahan src refspec ketika gagal mendorong yang lama ke repositori baru.
Informagic

2

Tidak yakin apakah ini cara yang baik, tapi tetap mudah:

git clone -b new-project git@github.com:User/YourProject.git newProjcet

Kemudian buat repo baru di github, dan dorong.


2

Ingat bahwa ketika Anda hanya membuat repo baru, Anda kehilangan referensi ke yang lama, dan membuatnya lebih sulit untuk mempertahankan setiap pembaruan ke proyek asli yang disinkronkan dengan yang baru. Mungkin bukankah lebih baik untuk membayar repo?


0

Sedikit tambahan untuk jawaban yang benar:

$ git push git@github.com: accountname / new_repo + old_branch: master

"git@github.com: accountname / new_repo" => dapatkan dari github "Klon atau unduh" menu pull-down

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.