2011-08-18 10 views
17

Tôi đang thiết lập Git với Gerrit Code Review và đang tìm cách tạo các lệnh Git cần thiết tương đối đơn giản cho những người dùng có thể mới sử dụng Git.Làm thế nào để cấu hình refspec push upstream cụ thể cho Git khi được sử dụng với Gerrit?

Các lệnh Tôi hiện có để bắt đầu một chi nhánh tính năng mới cơ bản là (giả sử Gerrit là origin):

git checkout baseline 
git pull 
git checkout -b work1234 
git push -u origin work1234 

này bắt đầu một công việc gói mới work1234 nhánh từ một số baseline, và đẩy thức tạo ra các chi nhánh trong Gerrit và thiết lập thượng nguồn. Vì vậy, .git/config trông giống như sau:

[branch "work1234"] 
     remote = origin 
     merge = refs/heads/work1234 

Bây giờ, Gerrit muốn cam kết mới để xem xét được đẩy lên một refspec đặc biệt, refs/for/work1234 ví dụ. Tôi có thể làm điều này bằng tay với:

git push origin work1234:refs/for/work1234 

Những gì tôi muốn làm là tìm một số cách để thiết lập .git/config để một đồng bằng git push sẽ đẩy chi nhánh hiện tại để các refspec trên điều khiển từ xa mà Gerrit yêu cầu. Tôi đã nhìn vào git config lĩnh vực sau:

  • branch.<name>.* - dường như không có bất kỳ tùy chọn cụ thể cho việc thiết push refspec
  • push.default - Tôi muốn loại upstream đây
  • remote.<name>.push - Tôi cố gắng refs/heads/*:refs/for/* tại đây nhưng git push luôn muốn đẩy tất cả các chi nhánh địa phương trong trường hợp này, trong khi tôi chỉ muốn hiện tại chi nhánh

Nếu tôi không thể làm cho Git làm điều này một mình, tôi sẽ viết một kịch bản trình bao bọc nhỏ chỉ định đầy đủ các refspec. Tuy nhiên, sẽ tốt hơn nếu Git có thể đẩy đến đúng nơi.

Trả lời

9

tôi đã kết thúc viết một git-submit kịch bản mới:

#!/bin/sh -e 

if [ -z "$1" ]; then 
    REMOTE=origin 
else 
    REMOTE=$1 
fi 

BRANCH=`git symbolic-ref HEAD` 
case $BRANCH in 
    refs/heads/*) 
     BRANCH=`basename $BRANCH` 
     ;; 
    *) 
     echo "I can't figure out which branch you are on." 
     exit 1 
     ;; 
esac 

git push $REMOTE HEAD:refs/for/$BRANCH 

tôi đặt kịch bản này trong /usr/local/libexec/git-core/git-submit và bây giờ có một lệnh để gửi mã mới để Gerrit để xem xét:

$ git submit 

Nếu Gerrit là không phải từ xa origin, sau đó sử dụng git submit <remote> nếu thích hợp.

+1

Sẽ có giải pháp git-only đơn giản hơn nếu tôi luôn muốn đẩy đến đích cố định, nói 'refs/for/master'? ([Đây] (http://stackoverflow.com/questions/29664305/equivalent-of-branch-name-merge-for-git-push) câu hỏi SO của tôi yêu cầu phiên bản đơn giản hơn về vấn đề của bạn.) – Pradhan

0
git config push.default upstream 
git config branch.work1234.merge refs/for/work1234 
git config branch.work1234.remote origin 

hoặc .git/config:

[push] 
     default = upstream 
[branch "work1234"] 
     merge = refs/for/work1234 
     remote = origin 

Tôi không chắc chắn nếu có một cách để đặt một ký tự đại diện trong đó bất cứ nơi nào để làm cho nó làm việc cho tất cả các chi nhánh.

+0

Điều này sẽ phá vỡ 'git-pull' khi nó cố kéo từ' refs/for/* 'không thành công. Điều khiển từ xa có thể không cần thiết như mặc định là "origin". – Wernight

4

Hai tùy chọn Tôi đã tìm thấy:

1) Kiểm tra một dự án tôi thực hiện, GGH: https://github.com/hobbs/ggh

2) Bạn có thể cấu hình push refspec mặc định trong điều khiển từ xa.Tôi chỉ tìm ra cách để làm điều này với một chi nhánh từ xa mã hóa cứng, vẫn đang cố gắng tìm ra cách để ký tự đại diện các refspec từ xa để nó luôn đẩy để điều khiển từ xa bạn đang theo dõi:

[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = ssh://gerrit/repo 
    push = HEAD:refs/for/master 
2

Dưới đây là một cải thiện Câu trả lời của Greg Hewgill.

Tạo một kịch bản ở đâu đó trên đường, như vào thư mục bin hồ sơ của bạn (tạo một nếu cần thiết, ngay cả trên Windows):

$ mkdir ~/bin 
$ vi ~/bin/git-submit 

Với nội dung sau:

#!/bin/sh -e 

if [ -z "$1" ]; then 
    REMOTE=origin 
else 
    REMOTE=$1 
fi 

BRANCH=`git symbolic-ref HEAD` 
case $BRANCH in 
    refs/heads/*) 
     BRANCH=`basename $BRANCH` 
     ;; 
    *) 
     echo "I can't figure out which branch you are on." 
     exit 1 
     ;; 
esac 

REMOTE_BRANCH=`git config --get "branch.$BRANCH.merge"` 
if [ -z $REMOTE_BRANCH ] 
then 
    echo "There is no tracking information for the current branch." 
    echo "If you wish to set tracking information for this branch you can do so with:" 
    echo "" 
    echo " git branch --set-upstream $BRANCH <remote>/<branch>" 
    echo "" 
    exit 1 
fi 

git push $REMOTE HEAD:refs/for/$REMOTE_BRANCH 

Giả sử bạn tạo chi nhánh theo dõi từ xa như:

$ git checkout -b MyBranch origin/master 

Bạn chỉ cần gọi:

$ git submit 

... để đẩy tới refs/for/master trong trường hợp này.