【问题标题】:git alias for HEAD:refs/for/masterHEAD 的 git 别名:refs/for/master
【发布时间】:2011-11-17 10:37:42
【问题描述】:

我正在配置Gerrit,我想避免写:

git push gerrit HEAD:refs/for/master

我想写:

git push review

我确定可以修改 .git/config,但我无法使其工作。

【问题讨论】:

    标签: git gerrit


    【解决方案1】:

    我设置了两种不同的推送类型,review 和 noreview:

    评论:

    git config remote.review.pushurl ssh://<GERRIT_HOST>:29418/<PROJECT_PATH>.git
    git config remote.review.push refs/heads/*:refs/for/*
    git push review # this will push your current branch up for review
    

    绕过审查:

    git config remote.noreview.pushurl ssh://<GERRIT_HOST>:29418/<PROJECT_PATH>.git
    git config remote.noreview.push refs/heads/*
    git push noreview # this will push your current branch up, bypassing review
    

    请注意,项目所有者/Gerrit 管理员还需要对 Gerrit 项目进行一些更改才能绕过审核。我认为需要将“推送”权限添加到 refs/* 的项目中(除非您具体了解允许绕过审查的分支)。但是,对于评论,已经设置了发布所需的权限。换句话说,如果你的

    git push gerrit HEAD:refs/for/master
    

    正在工作,而不是上面的“审查”部分应该也能正常工作,而无需更改任何其他内容。

    【讨论】:

    • 只是要指出,我认为这只有在你只关心主人的情况下才有效......我想你可以为你想要处理的每个分支命名一堆遥控器,但是'会和你最初的问题一样烦人。我对 Git/Gerrit 还很陌生,所以如果我想出一个更好的方法来处理所有事情,我会把它贴出来。
    • 我最好用git config remote.review.push HEAD:refs/for/master我觉得master的review比较频繁。
    • 对我来说这不起作用-当我使用它时,dst refspec 仍然是 refs/heads/dev:git push review dev
    【解决方案2】:

    为什么不创建 bash 别名?

    alias review="git push gerrit HEAD:refs/for/master"
    

    现在你可以输入:

    review
    

    如果您想处理更多而不是一个 gerrit 分支,请查看我的 bash 助手:https://github.com/tomwys/gerrit-bash-commands

    【讨论】:

    • 为什么不这样做呢?这是个好主意,但它不适用于我们这些在 Windows 上的人,例如:/
    • 如果使用像 eGit 或 SourceTree 这样的工具也会有问题
    【解决方案3】:

    您最好在别名中使用 Git 脚本。像这样的东西基于“上游”分支,虽然我还想稍微清理一下:

    ~/.gitconfig

    [alias]
      pub = "!f() { git push -u ${1:-origin} HEAD:`git config branch.$(git name-rev --name-only HEAD).merge | sed -e 's@refs/heads/@refs/for/@'`; }; f"
    

    这样,您只需键入:

    git pub
    

    就像你输入的一样:

    git push -u origin HEAD:refs/for/master
    

    git push -u origin HEAD:refs/for/myremote-branch
    

    对此的唯一要求是它仅与 Windows 上的 Git Bash shell 或众多 Linux shell 之一兼容。

    【讨论】:

      【解决方案4】:

      您可能还对git-review 感兴趣,它不仅消除了push,只需提供:

      git review
      

      ...但也可以让您执行以下操作:

      git review branchname
      

      查看上面链接中的“使用”部分了解更多信息。

      【讨论】:

        【解决方案5】:

        也许不完全是您想要的,但如果您:

        1. gerrit 重命名为review(与git remote rename gerrit review),
        2. git config push.default tracking,和
        3. git config branch.master.merge refs/for/master,

        然后你可以git push review,你的主人会被推送到gerrit上的refs/for/master

        顺便说一句,如果您git config branch.master.remote review,那么您只需git push 就可以得到同样的东西。

        【讨论】:

        • 如果你在你的答案中改变 branch.master.merge ,你还能拉吗?
        • branch.master.merge 有效地告诉git pull 要获取和合并什么远程引用。
        • 是的,并且没有名为 refs/for/master 的远程引用,所以我很确定它不会工作
        • 首先这个问题根本没有解决拉动问题,其次,它已经有一年多了。如果您有任何问题,我建议您发布一个新问题,而不是通过 cmets 恢复旧问题。
        • 你说得对,我不应该把它当作一个问题。我只是向任何找到这个(旧)答案的人指出,通过这样做,他们将解决一个问题,但会引入另一个同样严重的问题(即拉动不起作用)。
        【解决方案6】:

        如果你想允许直接推送到 refs/heads/ 中的分支,你只需在 gerrit web gui 中添加一个权限:

        1. 打开项目属性,
        2. 选择访问,
        3. 添加参考,
        4. refs/heads/*
        5. 选择“推送”
        6. 输入组名,
        7. refs/heads/*
        8. 保存。

        你已经完成了。

        【讨论】:

          【解决方案7】:

          想要只通过gerrit推送到master分支的朋友,在.git\config添加以下内容

          [remote "review"]                                                        
              push = HEAD:refs/for/master                 
              pushurl = ssh://GERRIT_URL:29418/PROJECT_NAME
          

          或在项目目录中执行

          git config remote.review.push HEAD:refs/for/master
          git config remote.review.pushurl ssh://GERRIT_URL:29418/PROJECT_NAME
          

          然后就可以使用了

          git push review
          

          推送给 Gerrit。使用此方法,您可以从任何本地分支推送,数据将始终转到主分支

          【讨论】:

            【解决方案8】:

            您好,只需创建一个简单的脚本来自动化该过程:

               #!/bin/bash
            
               GROUP1_REVIEWER="group1 list of mail separated by space"
               GROUP2_REVIEWER="group2 list of mail separated by space"
               GROUP3_REVIEWER="group3 list of mail separated by space"
            
               ORIGIN=$(git config --get remote.origin.url)
               [ $? -ne 0 ] && echo "Git repo not found; EXIT" && exit 1
            
               case $1 in
                   group1) REVIEWER_LIST=$GROUP1_REVIEWER ;;
                   group2) REVIEWER_LIST=$GROUP2_REVIEWER ;;
                   group3) REVIEWER_LIST=$GROUP3_REVIEWER ;;
                   *) echo "Please specify one existent group"; exit 1 ;;
               esac
            
               [ "$1" == "" ] && echo "Please specify one existent group" && exit 1
            
               pushurl=${ORIGIN}
               push="HEAD:refs/for/master"
               receivepack="$(printf "git receive-pack "; for reviewer in $REVIEWER_LIST ; do printf -- "--reviewer $reviewer "; done)"
            
               # check if review remote is already present
               git config -l | grep remote.review 1>/dev/null 2>&1
               [ $? -eq 0 ] && echo "Remote review already present; configure it manually; EXIT" && exit 1
            
               # start config
               echo "Adding new remote review config"
               git config remote.review.pushurl $pushurl
               git config remote.review.push $push
               git config remote.review.receivepack "$receivepack"
            

            您将用作:

            git_review_add_config.sh group1
            

            并选择您需要配置的不同组。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-03-29
              • 2018-06-25
              • 1970-01-01
              • 2011-05-20
              • 1970-01-01
              • 2011-05-22
              • 1970-01-01
              • 2016-06-24
              相关资源
              最近更新 更多