2011-08-18 108 views
17

我使用Gerrit Code Review來設置Git,並正在尋找一種方式來爲那些可能是Git新手的用戶提供必要的Git命令。如何在配合Gerrit使用時爲Git配置特定的上游push refspec?

開始一個新的特性分支基本上是我目前擁有的命令(假設格里特是origin):

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

這開始從一些baseline支新的工作包work1234,並最終推動創建分支在Gerrit中設置上游。所以.git/config看起來像:

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

現在,格里特要審覈新提交被推到一個特殊的Refspec,refs/for/work1234例如。我可以手動執行此操作:

git push origin work1234:refs/for/work1234 

我想要做的就是找到一些方法來建立.git/config使一個普通的git push將當前分支推到的Refspec是格里特需要遙控器上。我已經看着下面git config方面:

  • branch.<name>.* - 似乎沒有任何具體的選項設置推送的Refspec
  • push.default - 我有點想upstream這裏
  • remote.<name>.push - 我試過refs/heads/*:refs/for/*這裏只是git push總想推全部本地分支在這種情況下,我只想目前分支

如果我不能讓Git自己做這個,我會寫一個小的包裝腳本來完全指定refspecs。但是,如果Git能夠原生地推到正確的位置,那將會更好。

回答

9

我最後寫一個新的git-submit腳本:

#!/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 

我把這個腳本/usr/local/libexec/git-core/git-submit和現在有一個命令提交新的代碼格里特審查:

$ git submit 

如果格里特是而不是origin遙控器,然後酌情使用git submit <remote>

+1

如果我總是想推到一個固定的目的地,比如'refs/for/master',會不會有一個簡單的git-only解決方案? ([這裏是](http://stackoverflow.com/questions/29664305/equivalent-of-branch-name-merge-for-git-push)我的SO問題問你問題的簡單版本。) – Pradhan

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

或git的/配置:

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

我不知道是否有把一個通配符在那裏的任何地方,使之成爲所有部門的工作方式。

+0

這將打破'git-pull',因爲它會嘗試從'refs/for/*'中拉出失敗。遠程可能不需要,因爲默認是「原點」。 – Wernight

4

兩個選項,我發現:

1)檢查一個項目我做了,GGH:https://github.com/hobbs/ggh

2)您可以在遠程配置默認推的Refspec。我只是想出如何與一個硬編碼的遠程分支做到這一點,仍在試圖弄清楚如何通配符遠程的Refspec所以它總是推到正在跟蹤遠程:

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

這裏是一個Greg Hewgill回答。

路徑上創建一個腳本地方,例如在你的個人bin文件夾(如果有必要創建一個,甚至在Windows上):

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

具有以下內容:

#!/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 

假如你創建一個遠程跟蹤分支,如:

$ git checkout -b MyBranch origin/master 

您可以簡單地調用:

$ git submit 

...在這種情況下推送到refs/for/master