Atur git untuk menarik dan mendorong semua cabang


616

Saya ingin mendorong dan menarik semua cabang secara default, termasuk yang baru dibuat.

Apakah ada pengaturan yang dapat saya tetapkan untuk itu?

Kalau tidak, ketika saya menambahkan cabang baru, secara lokal dan saya ingin menariknya dari server, apa cara paling sederhana untuk melakukannya?

Saya membuat cabang baru dengan nama yang sama dan mencoba menarik tetapi tidak berhasil. Meminta saya untuk semua konfigurasi jarak jauh cabang. Bagaimana cara mengaturnya.


4
"dan mencoba menarik tetapi tidak berhasil". Tolong detailnya. Tunjukkan pada kami perintah apa yang Anda coba gunakan.
Jakub Narębski

Jawaban:


1298

Cara paling sederhana adalah dengan melakukan:

git push --all origin

Ini akan mendorong tag dan cabang.


10
Di antara lusinan jawaban yang saya temukan di SO dan tempat lain, ini adalah cara paling sederhana untuk mendorong cabang lokal yang baru dibuat, tanpa menyentuh konfigurasi. Terima kasih!
András Szepesházi

174
Dan jika Anda menambahkan -usatu kali, mis git push --all origin -u. Pelacakan sudah diatur dan setelah itu Anda cukup menggunakan git push.
Alec

23
Untuk git versi 1.7.12.3 saya harus menggunakan git push --tags originuntuk mendorong semua tag.
thisgeek

17
Lihat juga "--mirror" alih-alih "--all" ini mendorong lebih banyak barang
Loda

21
PERINGATAN: Jika Anda memiliki banyak cabang LOKAL yang belum Anda bersihkan (fitur, perbaikan terbaru) - atau tidak dibersihkan dengan benar (saya), ini akan membanjiri remote Anda. Sial. Dan kami baru saja melakukan pemangkasan. Tidak yakin mengapa lokal saya memiliki begitu banyak cabang yang tersisa.
Jack

147

Dengan git modern, Anda selalu mengambil semua cabang (sebagai cabang pelacakan jarak jauh ke dalam refs/remotes/origin/*namespace, terlihat dengan git branch -ratau git remote show origin).

Secara default (lihat dokumentasi push.defaultvariabel config) Anda mendorong cabang-cabang yang cocok , yang berarti bahwa pertama-tama Anda harus melakukannya git push origin branchagar git selalu mendorongnya git push.

Jika Anda ingin selalu mendorong semua cabang , Anda dapat mengatur push refspec. Dengan asumsi bahwa remote dinamai originAnda dapat menggunakan git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

atau secara langsung mengedit .git/configfile untuk memiliki sesuatu seperti berikut:

[asal "jarak jauh"]
        url = user@example.com: /srv/git/repo.git
        fetch = + ref / head / *: ref / remote / origin / *
        fetch = + ref / tag / *: ref / tag / *
        push = + referensi / kepala / *: referensi / kepala / *
        push = + ref / tag / *: ref / tag / *

3
@Merc: git push --all originbagus sekali untuk menerbitkan semua cabang dan tag, meskipun secara default sampai versi semantik 'yang cocok' artinya Anda akan mendorong semua cabang setelahnya ... kecuali Anda menambahkan cabang atau tag baru. The pengaturan untuk "push [...] semua cabang secara default" adalah seperti yang tertulis.
Jakub Narębski

Anda dapat meningkatkan jawaban untuk menambahkan cara mengkonfigurasi ulang Git dengan cara ini. Ini berguna untuk pengguna yang telah mengatur mode sederhana.
Dereckson

3
Ini telah berubah sejak git 2.0. Standar push sederhana, tidak cocok lagi.
mike

Saya mencoba ini dan mendapat kesalahan saat ditekan: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Catatan: Saya menggunakan git 2.0. Saya masih mencari cara untuk memperbaikinya.)
Brian Lacy

2
Sekarang nilai default untuk push.defaultadalah simple.
hasanghaforian

32

Memasukkan + dalam spec push mungkin adalah ide yang buruk, karena itu berarti bahwa git akan dengan senang hati melakukan push non-fast-forward bahkan tanpa -f , dan jika server jarak jauh diatur untuk menerima itu, Anda dapat kehilangan sejarah.

Coba saja ini:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Anda juga dapat menambahkan --globalopsi ke masing-masing untuk menjadikan ini sebagai standar global untuk semua repositori Anda.
Eter

Sangat disayangkan bahwa + ditambahkan secara otomatis oleh git saat melakukan git remote add.
Eter

27

Saya telah menggunakan perintah di bawah ini untuk memigrasi semua cabang ke repositori baru.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

CATATAN : Saya harus menggunakan perintah kedua terakhir (yaitu push master dulu) saat mengkloning repo dari Atlassian Stash ke AWS CodeCommit (blank repo). Saya tidak yakin alasannya, tetapi setelah mendorong ( git push new-origin --mirror) cabang default merujuk ke beberapa cabang selain master.


1
Sempurna untuk memindahkan repo ke host lain. Terima kasih!
Diluncurkan pada

2
Ini memang hanya metode yang bermanfaat. Gunakan git push new_origin --allhanya mendorong cabang lokal Anda saat ini ke new_origin, tidak semua cabang asal.
yanzi1225627

Hanya mencatat bahwa ini membuat --barerepositori, yang sedikit berbeda dari repositori biasa, hanya memiliki .gitfile, bukan file Anda. Ini cukup sempurna jika Anda tidak akan melakukan pekerjaan di dalamnya. Lihat --baredan --mirror git-scm.com/docs/git-clone .
jmmut

Semua meskipun hanya memiliki file .git dan bukan kode sumber yang sebenarnya, jika Anda melakukan pembaruan jarak jauh itu akan mengambil kembali semuanya dari asal ke tujuan.
SanthoshM

Ini adalah penyelamat! Metode "master sebelum cermin" ini memperbaiki masalah dengan Bitbucket sebagai tujuan dan meyakini cabang berbeda selain "master" adalah cabang utama.
Toddius Zho

12

Jika Anda memindahkan cabang ke repo baru dari yang lama dan TIDAK memiliki semua cabang repo lama setempat, Anda harus melacaknya terlebih dahulu.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Kemudian tambahkan repo jarak jauh baru Anda:

git remote add bb <path-to-new-repo>

Kemudian Anda dapat mendorong semua menggunakan perintah ini:

git push -u bb --all

Atau Anda dapat mengkonfigurasi repo menggunakan perintah git config yang dicatat dalam respons lain di sini jika Anda tidak melakukan ini satu kali atau hanya ingin memindahkan cabang lokal.

Yang penting, tanggapan lain hanya mendorong semua cabang LOKAL. Jika cabang hanya ada pada repositori REMOTE alternatif, mereka tidak akan bergerak tanpa melacaknya terlebih dahulu. Untuk for loop yang disajikan di sini akan membantu dengan itu.


BTW, saya menggunakan "bb" di tempat "asal" di sini karena saya menganggap repositori asli / lama Anda bernama "asal" dan kemungkinan masih melekat pada label itu. "bb" adalah untuk Bitbucket, tempat saya memindahkan repo asli saya, tetapi Anda dapat menyebutnya sesuatu yang lebih berlaku seperti "neworigin" jika Anda mau.
Lance Cleveland

2
Itu tidak berhasil untuk saya. Berakhir dengan semua cabang jarak jauh yang melacak cabang lokal yang sama: /
jhsowter

2
AFAIK ini seharusnya tidak berfungsi, sesuai komentar @jhsowter. perintah yang tepat bagi saya untuk melacak cabang jarak jauh di repo yang baru dikloning adalah git branch --track reponame origin/reponamejika tidak, Anda akan mendapatkan semua cabang jarak jauh dilacak di cabang lokal saat ini
Pioneer Skies

Saya mengubah cuplikan pengumpul-repo menjadi git branch -r | grep -v '\->' | sed 's/ origin\///', yang hanya memberikan nama cabang jarak jauh.
Paul Hicks

6

Untuk melihat semua cabang tanpa menggunakan git branch -aAnda harus menjalankan:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Sekarang Anda dapat melihat semua cabang:

git branch

Untuk mendorong semua cabang, coba:

git push --all

1
λ git fetch - semua asal fatal: fetch - semua tidak mengambil argumen repositori
foxundermon

Anda mencoba git fetch --all?
tokhi

4

Jika Anda memindahkan semua cabang ke repo baru dari yang lama maka di repo lokal Anda, Anda perlu mengatur pelacakan setiap cabang ke cabang asal yang ada, sebelum mendorong ke repo baru, jika tidak semua cabang asal Anda tidak akan muncul di asal baru. Lakukan ini secara manual dengan melacak atau memeriksa setiap cabang, atau gunakan satu liner:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Perintah satu baris ini didasarkan pada versi-versi itu dalam jawaban lain di halaman ini, tetapi bisa dibilang lebih baik karena:

  1. itu benar mengatur pelacakan cabang, tidak seperti beberapa varian yang lebih tua dari perintah ini pada halaman ini yang hanya menyediakan satu parameter untuk --track dan dengan demikian setiap cabang berakhir master pelacakan - tidak baik
  2. menamai cabang lokal tanpa awalan "asal /" yang secara pribadi tidak saya inginkan - dan konsisten dengan apa yang terjadi ketika Anda checkout cabang secara normal.
  3. lewati master pelacakan karena itu sudah terjadi
  4. sebenarnya tidak checkout apa pun dengan cepat
  5. menghindari tersandung -> pada output dari git branch -r

Selanjutnya, jika Anda mengganti asal, ganti tautan ke asal lama dan arahkan ke remote baru. Pastikan Anda membuat remote baru terlebih dahulu, menggunakan bitbucket / github GUI, tetapi jangan menambahkan file apa pun ke dalamnya atau akan ada masalah penggabungan. Misalnya

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Sekarang dorong. Perhatikan bahwa perintah kedua diperlukan untuk mendorong tag juga:

git push -u --all origin
git push --tags origin

0

Solusi tanpa hardcoding originpada konfigurasi

Gunakan yang berikut ini di gitconfig global Anda

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Ini mendorong semua cabang dan semua tag

Mengapa Anda TIDAK harus hardcode origindalam konfigurasi?

Jika Anda hardcode:

  1. Anda akan berakhir dengan originsebagai remote di semua repo. Jadi Anda tidak akan bisa menambahkan asal, tetapi Anda harus menggunakan set-url.
  2. Jika alat membuat remote dengan nama yang berbeda, push all config tidak akan berlaku. Maka Anda harus mengubah nama remote, tetapi mengubah nama tidak akan berfungsi karena originsudah ada (dari titik 1) ingat :)

Pengambilan sudah dilakukan oleh git modern

Sesuai jawaban Jakub Narębski:

Dengan git modern Anda selalu mengambil semua cabang (sebagai cabang pelacakan jarak jauh ke dalam ref / remote / origin / * namespace

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.