Mengapa git push gerrit HEAD: refs / for / master digunakan sebagai pengganti git push origin master


148

Saya baru saja mulai menggunakan gerrit dan saya ingin tahu mengapa kita perlu melakukan git push gerrit HEAD:refs/for/masterdaripada melakukangit push origin master

Jika saya melakukannya git push origin mastersaya mendapatkan pesan kesalahan! [remote rejected] master -> master (prohibited by Gerrit)

Jawaban:


259

Dokumentasi untuk Gerrit, khususnya bagian "Perubahan push" , menjelaskan bahwa Anda mendorong ke " refs/for/'branch'ref ajaib menggunakan alat klien Git".

Gambar berikut diambil dari Pengantar ke Gerrit . Ketika Anda mendorong ke Gerrit, Anda melakukannya git push gerrit HEAD:refs/for/<BRANCH>. Ini mendorong perubahan Anda ke area pementasan (dalam diagram, "Perubahan Tertunda"). Gerrit sebenarnya tidak memiliki cabang yang dipanggil <BRANCH>; itu terletak pada klien git.

Secara internal, Gerrit memiliki implementasi sendiri untuk tumpukan Git dan SSH. Ini memungkinkannya untuk memberikan refs/for/<BRANCH>referensi "magis" .

Ketika permintaan push diterima untuk membuat ref di salah satu ruang nama ini Gerrit melakukan logikanya sendiri untuk memperbarui database, dan kemudian berbohong kepada klien tentang hasil operasi. Hasil yang sukses menyebabkan klien percaya bahwa Gerrit telah menciptakan referensi, tetapi dalam kenyataannya Gerrit belum menciptakan referensi sama sekali. [ Tautan - Gerrit, "Detail Berpasir" ].

Alur kerja Gerrit

Setelah tambalan yang berhasil (yaitu tambalan telah didorong ke Gerrit, [memasukkannya ke dalam area pementasan "Pending Changes], ditinjau, dan peninjauan telah berlalu), Gerrit mendorong perubahan dari" Pending Changes "ke dalam" Repositori Resmi ", menghitung cabang mana yang mendorongnya berdasarkan sihir yang dilakukannya ketika Anda mendorong ke refs/for/<BRANCH>. Dengan cara ini, tambalan yang berhasil ditinjau dapat ditarik langsung dari cabang yang benar Authoritative Repository.


Karena penasaran, apa yang sebenarnya terjadi jika Anda melakukan sesuatu seperti "git push origin" saja? Saya mencobanya dan tidak dapat melihat perubahan di mana pun, demikian pertanyaannya. Tapi itu ada di log lokal saya, secara alami.

1
@Pintolaranja saya melakukan hal yang sama secara tidak sengaja. Anda benar, Gerrit "menangani" situasi seperti itu, tetapi itu tidak membuat perubahan apa pun. Jadi sebenarnya, itu tidak menanganinya sama sekali. Yang benar-benar membuatku kesal, karena ini benar-benar bodoh. Mengapa mengizinkan pengguna untuk melakukan sesuatu, yang tidak dapat ditangani oleh Gerrit dengan benar?
trejder

1
@regg Ya. Tanda panah menunjukkan sumber dan tujuan perintah, bukan aliran data selanjutnya sebagai akibatnya. misalnya Pengembang 1 mengeluarkan pengambilan ke Repositori Resmi, bukan sebaliknya
Gareth

5
@trejder Memungkinkan karena Gerrit memungkinkan Anda mengonfigurasi beberapa akun untuk mem-bypass ulasan. Dengan mendorong ke cabang default, Anda secara efektif mengatakan "Saya ingin menggabungkan perubahan ini tanpa ulasan." Jika Anda tidak diizinkan melakukan itu, push gagal.
Hounshell

4
Atau Anda tidak dapat menggunakan gerrit dan menghindari kekacauan lucu ini sama sekali.
C Johnson

57

Untuk menghindari keharusan menentukan sepenuhnya perintah git push, Anda dapat mengubah file git config sebagai alternatif:

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

Sekarang Anda cukup:

git fetch gerrit
git push gerrit

Ini menurut Gerrit


1
+1 dari saya! Ini cara yang lebih baik hanya memiliki hard-coded ini untuk saya remote.origin.pushdaripada harus mengetik / menempelkannya setiap waktu!
DaoWen

7
@SeanMurphy Anda dapat membuatnya lebih umum dengan mengganti instance 'master' dengan '*' sehingga sesuatu seperti 'git push gerrit TopicBranch' juga akan berfungsi.
David Doria

Juga, jika gerrit adalah satu-satunya remote Anda, Anda tidak perlu menentukannya sama sekali. Saya hanya melakukan git fetchdan git pushdengan @DavidDoria konfigurasi yang disebutkan di atas.
bernk

push = refs / heads / *: refs / for / * untuk semua cabang
Victor Choy

Anda benar-benar perlu menggunakan cabang hulu, bukan cabang Anda saat ini. Saya biasanya memiliki selusin perubahan yang terjadi secara paralel, jadi menggunakan satu cabang saja tidak berfungsi.
Christian Goetze
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.