Saya memiliki pengaturan remote berikut:
$ git remote
korg
rorg
Dan cabang-cabang berikut:
$ git branch -a
* (no branch)
remotes/korg/gingerbread
remotes/korg/gingerbread-release
remotes/korg/honeycomb
remotes/korg/honeycomb-mr1-release
remotes/korg/master
remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
remotes/m/gingerbread -> korg/gingerbread
Sekarang saya ingin mendorong semua cabang jarak jauh dari korg
ke rorg
jarak jauh. Bagaimana aku melakukan itu?
Lebih disukai tanpa membuat cabang lokal untuk setiap cabang terlebih dahulu, jika itu dapat dihindari.
git
git-branch
git-push
git-remote
Bjarke Freund-Hansen
sumber
sumber
Jawaban:
Tes cepat yang membuat beberapa repositori sementara menunjukkan Anda dapat membuat refspec yang dapat melakukan ini:
Jadi asal / BRANCHNAME: ref / kepala / BRANCHNAME
Memeriksa di
rorg
remote saya :sumber
git push rorg origin/one:one
(tanparefs/heads/
) saja?refs/heads/
awalan Anda mendorong remote branched yang tidak perlu checkout keone
Saya menemukan ini:
Dan itu mendorong semua cabang terpencil saya dari korg ke rorg (bahkan tanpa salinan cabang lokal). Lihat output di bawah ini:
Dan kemudian Anda dapat membuat dorongan yang sama untuk
tags
ref:sumber
Everything up-to-date
di git 2.10.0 tanpa terjadi apa-apa, sambil melakukan hal yang sama pada masing-masing cabang bekerja.HEAD
. Tapi itu bisa dihapus.git push rorg :HEAD
git push rorg refs/tags/*:refs/tags/*
. Yang sama dengangit push rorg --tags
, tetapi baik untuk memahami apa yang dilakukan hal-hal ini :)Untuk melengkapi jawaban patthoyt , berikut ini skrip shell pendek yang mendorong semua cabang dari satu remote ke yang lain:
Untuk meringkas, untuk setiap cabang jarak jauh pada sumber jarak jauh (tidak termasuk cabang "pointer" seperti KEPALA), tekan ref itu ke tujuan jarak jauh. (
${a//$SRC_REMOTE\/}
Bit menghapus nama sumber jauh dari nama cabang, yaituorigin/master
menjadimaster
.)sumber
git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Ini berfungsi di Zsh
sumber
Untuk skrip apa pun yang saya jalankan, sebaiknya simpan atau lakukan semua perubahan Anda.
Saya perlu mendorong beberapa cabang dari satu remote ke yang lain. Jawaban ini mensyaratkan bahwa cabang lokal sebelumnya ada
Ubah saja origin1 ke sumber remote, dan origin2 ke tujuan remote. Salin ini ke "remoteBranchCloner.sh" dan menyebutnya dengan "sh callBranchCloner.sh".
Mungkin ada cara yang lebih baik , yang tidak melakukan beberapa dorongan.
Jika Anda menggunakan kode saya, Anda mungkin ingin menggunakan caching kredensial, jika tidak , Anda harus mengetikkan waktu kredensial serveral Anda.
Untuk windows :
Catatan: Skrip ini untuk linux . Jika Anda menjalankannya di "git bash" skrip akan berfungsi, tetapi Anda tidak dapat menjalankannya dari konsol asli tanpa menginstal sesuatu yang istimewa.
Untuk linux
Di mana [--global] berarti secara opsional tambahkan --global
Jika Anda ingin mengatur pelacakan jarak jauh untuk semua cabang ke remote baru:
Disimpan sebagai file .sh dan dijalankan dengan "sh filename.sh" akan mengatur semua upstreams untuk melacak 'remotename' jarak jauh
sumber
Karena
HEAD
cabang tambahan yang dibuat dalam jawaban sebelumnya , cara terbersih yang saya temukan untuk melakukan ini adalah mengkloning ke repositori kosong dan kemudian mendorong semua cabang ke remote sebagai berikut:sumber