2011-08-18 6 views
17

私はGitをGerrit Code Reviewと設定しています.Gitを初めて使うユーザーにとって必要なGitコマンドを比較的簡単にする方法を探しています。Gerritで特定のアップストリームプッシュrefspecを設定するには?

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

これは、いくつかのbaselineから分岐した新しいワークパッケージwork1234を開始し、最後の一押しは、ブランチを作成します。

あり、本質的に新機能ブランチを開始する私は現在持っているコマンド(ヘリットがoriginであると仮定した場合)ゲリットで、上流を設定します。特別refspecにプッシュするレビュー用

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

さて、ゲリットが望んでいる新しいコミット、例えばrefs/for/work1234:だから.git/configは次のように見えます。私は何をしたいのは、プレーンgit pushがヘリットが必要で、リモートでrefspecに現在のブランチをプッシュするように.git/configを設定するにはいくつかの方法を見つけることである

git push origin work1234:refs/for/work1234 

:私は手動でこれを行うことができます。私は、次のgit config分野を見てきました:

  • branch.<name>.*から
  • push.default refspecプッシュを設定するための任意の特定のオプションを持っていないようです - 私は、ソートのここupstream
  • remote.<name>.pushをしたい - 私はrefs/heads/*:refs/for/*を試してみましたここにあるが、git pushはいつも押してほしいすべてこの場合、私はちょうどを望んでいる間にブランチ

Gitが単独でこれを行うことができない場合は、refspecsを完全に指定する小さなラッパースクリプトを作成します。しかし、Gitがネイティブに適切な場所にプッシュできるのは良いでしょう。私は/usr/local/libexec/git-core/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 

$ git submit 

ヘリットがある場合

答えて

9

は、私は新しいgit-submitスクリプトを書いてしまいましたリモートのoriginではなく、git submit <remote>を適切に使用してください。

+1

もし私がいつも固定の行き先、例えば 'refs/for/master'にプッシュしたいのであればもっと簡単なgit-onlyの解決策がありますか? (あなたの問題の単純なバージョンを尋ねる)[[Here's](http://stackoverflow.com/questions/29664305/equivalent-of-branch-name-merge-for-git-push)私の質問。 – Pradhan

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 

私はそれがすべての支店のために動作させるためにどこでもそこにワイルドカードを配置する方法があるかどうかわかりません。私が見つけた

+0

これは、失敗した 'refs/for/* 'から引き出そうとするとき' git-pull'を実行します。デフォルトは "origin"なので、リモコンはおそらく必要ありません。 – Wernight

4

つのオプション:

1)GGH、私が作ったプロジェクトをチェックアウト:https://github.com/hobbs/ggh

2)あなたは、リモートでのデフォルトのプッシュrefspecを設定することができます。ここで

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

がある:私はまだ、それは常にあなたが追跡しているリモートにプッシュするように、リモートrefspecをワイルドカードする方法を把握しようと、ハードコードされたリモートブランチでこれを行う方法を考え出しましたグレッグ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 

次のようなリモートトラッキングブランチを作成してください:この場合、refs/for/masterにプッシュする。

関連する問題