Tại sao git push gerrit HEAD: refs / for / master được sử dụng thay vì git push origin master


147

Tôi mới bắt đầu sử dụng gerrit và tôi muốn biết lý do tại sao chúng ta cần phải làm git push gerrit HEAD:refs/for/masterthay vì làmgit push origin master

Nếu tôi làm git push origin mastertôi nhận được lỗi nói! [remote rejected] master -> master (prohibited by Gerrit)

Câu trả lời:


259

Tài liệu về Gerrit, đặc biệt là phần "Thay đổi đẩy" , giải thích rằng bạn đẩy đến " refs/for/'branch'ref ma thuật sử dụng bất kỳ công cụ máy khách Git nào".

Hình ảnh sau đây được lấy từ Giới thiệu đến Gerrit . Khi bạn đẩy đến Gerrit, bạn làm git push gerrit HEAD:refs/for/<BRANCH>. Điều này đẩy các thay đổi của bạn đến khu vực tổ chức (trong sơ đồ, "Đang chờ thay đổi"). Gerrit không thực sự có một chi nhánh được gọi là <BRANCH>; nó nằm cho khách hàng git.

Trong nội bộ, Gerrit có triển khai riêng cho ngăn xếp Git và SSH. Điều này cho phép nó cung cấp các refs/for/<BRANCH>ref "ma thuật" .

Khi nhận được yêu cầu đẩy để tạo một ref trong một trong các không gian tên này, Gerrit sẽ thực hiện logic riêng của mình để cập nhật cơ sở dữ liệu, và sau đó nói dối với khách hàng về kết quả của hoạt động. Một kết quả thành công khiến khách hàng tin rằng Gerrit đã tạo ra ref, nhưng thực tế Gerrit hoàn toàn không tạo ra ref. [ Liên kết - Gerrit, "Chi tiết Gritty" ].

Quy trình làm việc của Gerrit

Sau khi bản vá thành công (nghĩa là bản vá đã được đẩy lên Gerrit, [đưa nó vào khu vực tổ chức "Thay đổi đang chờ xử lý"], đã xem xét và đánh giá đã được thông qua), Gerrit đẩy thay đổi từ "Thay đổi đang chờ xử lý" vào " Kho lưu trữ có thẩm quyền ", tính toán nhánh nào sẽ đẩy nó vào dựa trên phép thuật mà nó đã làm khi bạn đẩy tới refs/for/<BRANCH>. Bằng cách này, các bản vá được đánh giá thành công có thể được lấy trực tiếp từ các nhánh chính xác của Authoritative Repository.


Vì tò mò, điều gì thực sự xảy ra nếu bạn làm một cái gì đó như "git đẩy nguồn gốc"? Tôi đã thử nó và không thể thấy sự thay đổi ở bất cứ đâu, do đó, câu hỏi. Nhưng nó tồn tại trong nhật ký địa phương của tôi, một cách tự nhiên.

1
@Pintolaranja Tôi cũng làm như vậy một cách tình cờ. Bạn nói đúng, Gerrit "xử lý" tình huống như vậy, nhưng nó không tạo ra bất kỳ thay đổi nào. Vì vậy, thực sự, nó không xử lý nó cả. Điều đó thực sự làm tôi bực mình, vì điều này thực sự ngu ngốc. Tại sao để cho phép người dùng cam kết điều gì đó, Gerrit không thể xử lý đúng cách?
trejder

1
@gregb Có. Các mũi tên chỉ ra nguồn và đích của lệnh, không phải bất kỳ luồng dữ liệu tiếp theo nào là kết quả của lệnh đó. ví dụ: Nhà phát triển 1 phát hành một bản tải xuống Kho lưu trữ có thẩm quyền, không phải cách khác
Gareth

5
@trejder Nó cho phép điều đó bởi vì Gerrit cho phép bạn định cấu hình một số tài khoản để bỏ qua các đánh giá. Bằng cách đẩy đến nhánh mặc định, bạn thực sự nói rằng "Tôi muốn hợp nhất thay đổi này mà không cần xem xét." Nếu bạn không được phép làm điều đó, việc đẩy không thành công.
Hounshell 7/1/2015

4
Hoặc bạn không thể sử dụng gerrit và tránh hoàn toàn mớ hỗn độn vui nhộn này.
C Johnson

57

Để tránh phải chỉ định đầy đủ lệnh git đẩy, bạn có thể thay đổi tệp cấu hình git của mình:

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

Bây giờ bạn có thể chỉ cần:

git fetch gerrit
git push gerrit

Đây là theo Gerrit


1
+1 từ tôi! Nó tốt hơn khi chỉ cần mã hóa cứng này cho tôi remote.origin.pushthay vì phải gõ / dán nó mỗi lần!
DaoWen

7
@SeanMurphy Bạn có thể làm cho nó tổng quát hơn bằng cách thay thế các trường hợp của 'master' bằng '*' để một cái gì đó như 'git push gerrit TopicBranch' cũng sẽ hoạt động.
David Doria

Ngoài ra, nếu gerrit là điều khiển từ xa duy nhất của bạn, bạn hoàn toàn không phải chỉ định nó. Tôi chỉ cần làm git fetchgit pushvới cấu hình @DavidDoria đã đề cập ở trên.
bernk

đẩy = refs / Heads / *: refs / for / * dành cho tất cả các chi nhánh
Victor Choy

Bạn thực sự cần sử dụng nhánh ngược dòng, không phải nhánh hiện tại của bạn. Tôi thường có hàng tá thay đổi diễn ra song song, vì vậy sử dụng một nhánh duy nhất không hoạt động.
Christian Goetze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.