18

我正在使用Gerrit Code Review设置 Git,并正在寻找一种方法,让可能是 Git 新手的用户能够相对简单地使用必要的 Git 命令。

我目前用于启动新功能分支的命令本质上是(假设 Gerrit 是origin):

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

work1234这会启动一个从 some 分支的新工作包baseline,最终推送会在 Gerrit 中创建分支并设置上游。所以.git/config看起来像:

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

现在,例如,Gerrit 希望将新的提交审核推送到特殊的 refspec refs/for/work1234。我可以手动执行此操作:

git push origin work1234:refs/for/work1234

我想做的是找到一些方法来设置,.git/config以便一个普通git push的将当前分支推送到 Gerrit 需要的遥控器上的 refspec。我研究了以下git config领域:

  • branch.<name>.*- 似乎没有任何特定的选项来设置推送 refspec
  • push.default- 我有点想要upstream这里
  • remote.<name>.push- 我refs/heads/*:refs/for/*在这里尝试过,但在这种情况下git push总是想推送所有本地分支,而我只想要当前分支

如果我不能让 Git 自己做到这一点,我将编写一个完全指定 refspecs 的小包装脚本。但是,如果 Git 可以原生推送到正确的位置会更好。

4

4 回答 4

8

我最终写了一个新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,现在有一个命令可以将新代码提交给 Gerrit 以供审查:

$ git submit

如果 Gerrit 不是origin遥控器,则git submit <remote>酌情使用。

于 2011-08-21T23:05:47.520 回答
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
于 2012-02-16T17:48:45.780 回答
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...在这种情况下推动。

于 2012-08-08T16:10:17.490 回答
0
git config push.default upstream
git config branch.work1234.merge refs/for/work1234
git config branch.work1234.remote origin

或 .git/config:

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

我不确定是否有办法在任何地方放置通配符以使其适用于所有分支。

于 2011-08-22T02:52:19.493 回答