Git push gerrit HEAD: git push origin master yerine neden refs / for / master kullanılıyor?


151

Gerrit kullanmaya yeni başladım ve neden yapmak git push gerrit HEAD:refs/for/masteryerine yapmamız gerektiğini bilmek istiyorumgit push origin master

Eğer yaparsam git push origin masterhata mesajı alıyorum! [remote rejected] master -> master (prohibited by Gerrit)


1
bazı cevaplar olmasına rağmen, "müşteriye yalan söylemek" ve "büyülü" gibi. Yazılım mühendisliğinin şu anki durumundan hoşlanmadığım şey bu: işte kimse gerçekte ne olduğunu bilmiyor ve bu itme aslında bir çıktı veriyor fatal: internal server errorama bununla birlikte remote: SUCCESSçelişkili mesajlar gibi görünen bir çıktı ve bazen testler başladı. Gerrit, hiçbir şey değişmeden çalışır, bazen çalışmaz. Kimsenin neler olduğunu bilmediği duygusu iyi değil
nonopolarite

Yanıtlar:


263

Gerrit dokümantasyonu, özellikle "Değişiklikleri itin" bölümü, " refs/for/'branch'herhangi bir Git istemci aracını kullanarak sihirli ref'e " ittiğinizi açıklar .

Aşağıdaki görüntü Gerrit'e Giriş bölümünden alınmıştır . Gerrit'e ittiğin zaman yaparsın git push gerrit HEAD:refs/for/<BRANCH>. Bu, değişikliklerinizi aşama alanına (diyagramda "Bekleyen Değişiklikler") iter . Gerrit'in aslında adında bir şubesi yok <BRANCH>; git istemcisine yalan söylüyor.

Dahili olarak, Gerrit'in Git ve SSH yığınları için kendi uygulaması vardır. Bu, "sihirli" refs/for/<BRANCH>referanslar sağlamasına izin verir .

Bu ad alanlarından birinde bir ref oluşturmak için bir push isteği alındığında Gerrit, veritabanını güncellemek için kendi mantığını gerçekleştirir ve ardından işlemin sonucu hakkında müşteriye yalan söyler. Başarılı bir sonuç, müşterinin ref'i Gerrit'in yarattığına inanmasına neden olur, ancak gerçekte Gerrit ref'i hiç yaratmamıştır. [ Link - Gerrit, "Cesur Ayrıntılar" ].

Gerrit iş akışı

Başarılı bir yamadan sonra (yani, yama Gerrit'e gönderildikten, ["Bekleyen Değişiklikler" hazırlık alanına yerleştirildikten sonra gözden geçirildi ve inceleme geçildi), Gerrit değişikliği "Bekleyen Değişiklikler" den " Authoritative Repository ", ittiğinizde yaptığı sihre dayalı olarak hangi şubeye itileceğini hesaplar refs/for/<BRANCH>. Bu şekilde, başarıyla gözden geçirilen yamalar, doğrudan Authoritative Repository.


1
@Pintolaranja Ben de aynı şeyi kazara yaptım. Haklısın, Gerrit böyle bir durumu "ele alıyor", ama bu herhangi bir değişiklik yaratmıyor. Yani aslında bunu hiç ele almıyor. Bu gerçekten aptalca olduğu için beni gerçekten sinirlendiriyor. Gerrit'in düzgün bir şekilde idare edemediği bir şeyi kullanıcının işlemesine neden izin verelim?
trejder

2
@gregb Evet. Oklar komutun kaynağını ve hedefini gösterir, bunun sonucu olarak herhangi bir sonraki veri akışını değil. ör. Geliştirici 1, Yetkili Depoya bir getirme
Gareth

5
@trejder Buna izin verir çünkü Gerrit bazı hesapları incelemeleri atlayacak şekilde yapılandırmanıza izin verir. Varsayılan şubeye iterek, "Bu değişikliği incelemeden birleştirmek istiyorum" diyorsunuz. Bunu yapmanıza izin verilmezse, itme başarısız olur.
Hounshell

4
Ya da gerrit kullanıp bu komik karmaşadan tamamen kaçınamazsınız.
C Johnson

1
Aslında, git / gerrit birlikte çalışması düzgün bir şekilde oluşturulmuş olsaydı, böyle bir aptallık yapmanıza gerek kalmazdı ve sadece "git push origin" (daha iyisi, sadece "git push") yapardınız. Daha sonra git / gerrit böyle yapılandırılırdı değişikliklerinizi kod incelemesi için bir hazırlık alanına otomatik olarak yerleştirmenin bir yolu. Sizi değiştirmeyi düşündüğünüzden farklı bir yere itmeye zorlamak sadece aptalca, kafa karışıklığı yaratır ve bu da hatalara yol açar.
SmittyBoy

60

Git push komutunu tam olarak belirtmek zorunda kalmamak için, alternatif olarak git yapılandırma dosyanızı değiştirebilirsiniz:

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

Şimdi basitçe şunları yapabilirsiniz:

git fetch gerrit
git push gerrit

Bu Gerrit'e göre


1
Benden +1! remote.origin.pushHer seferinde yazmak / yapıştırmak yerine, benim için sabit kodlu olması çok daha güzel !
DaoWen

9
@SeanMurphy 'master' örneklerini '*' ile değiştirerek daha genel hale getirebilirsiniz, böylece 'git push gerrit TopicBranch' gibi bir şey de çalışacaktır.
David Doria

Ayrıca, gerrit sizin tek uzaktan kumandanızsa, onu hiç belirlemenize gerek yoktur. Ben basitçe git fetchve git pushyukarıda belirtilen @DavidDoria config ile yapıyorum.
bernk

1
push = refs / heads / *: refs / for / * tüm dallar için
Victor Choy 25'19

Mevcut şubenizi değil, gerçekten yukarı akış şubesini kullanmanız gerekir. Genelde paralel olarak devam eden bir düzine kadar değişikliğe sahibim, bu yüzden tek bir dal kullanmak işe yaramıyor.
Christian Goetze
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.