2011-08-18 5 views
17

Konfiguruję Git z Gerrit Code Review i szukam sposobu, aby niezbędne polecenia Git były stosunkowo proste dla użytkowników, którzy mogą być nowi w Git.Jak skonfigurować specyficzny push refspec dla Gita w połączeniu z Gerrit?

Komendy Obecnie mam na rozpoczęcie nowej funkcji oddziału są zasadniczo (zakładając Gerrit jest origin):

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

ten rozpoczyna nowy pakiet roboczy work1234 rozgałęziony od jakiegoś baseline, a ostateczne pchnięcie tworzy gałąź w Gerrit i ustawia upstream. Więc .git/config wyglądał:

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

Teraz Gerrit chce nowych zatwierdzeń dla przeglądu musi być odłożony do specjalnego refspec, refs/for/work1234 na przykład. Mogę to zrobić ręcznie:

git push origin work1234:refs/for/work1234 

Co chciałbym zrobić, to znaleźć jakiś sposób, aby skonfigurować .git/config tak, że zwykły git push pchnie aktualną gałąź do refspec na pilocie, który wymaga Gerrit. Mam spojrzał na następujących obszarach: git config

  • branch.<name>.* - wydaje się nie mieć żadnej konkretnej opcji ustawiania push refspec
  • push.default - I jakby chciał upstream tutaj
  • remote.<name>.push - Próbowałem refs/heads/*:refs/for/* tutaj ale git push zawsze chce wcisnąć wszystkie lokalnych oddziałów w tym przypadku, a ja po prostu chcę prąd oddział

Jeśli nie mogę zmusić Gita do zrobienia tego samodzielnie, napiszę mały skrypt, który w pełni określi refspecs. Byłoby jednak lepiej, gdyby Git mógł nacieszyć się we właściwe miejsce.

Odpowiedz

9

skończyło się pisanie nowej git-submit skrypt:

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

umieścić ten skrypt w /usr/local/libexec/git-core/git-submit a teraz jest jedna komenda złożyć nowy kod do Gerrit do przeglądu:

$ git submit 

Jeśli Gerrit jest nie zdalny origin, a następnie użyj odpowiednio git submit <remote>.

+1

Czy istnieje prostsze rozwiązanie git-only, jeśli zawsze chcę nacisnąć do określonego miejsca docelowego, powiedz 'refs/for/master'? ([Here] (http://stackoverflow.com/questions/29664305/equivalent-of-branch-name-merge-for-git-push) moje pytanie SO z prośbą o prostszą wersję twojego problemu.) – Pradhan

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

lub .git/config:

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

Nie jestem pewien, czy istnieje sposób, aby umieścić symbol wieloznaczny tam wszędzie, aby pracować dla wszystkich branż.

+0

To by złamało 'git-pull', ponieważ próbowałby pobrać z' refs/for/* ', który nie działa. Pilot prawdopodobnie nie jest potrzebny, ponieważ domyślnie jest "origin". – Wernight

4

dwie opcje znalazłem:

1) Sprawdź na projekt zrobiłem, ggh: https://github.com/hobbs/ggh

2) można skonfigurować domyślną Push refspec w pilocie.Mam tylko zorientowali się, jak to zrobić z zakodowanego na stałe zdalnego oddziału, wciąż próbuje dowiedzieć się, jak wieloznacznych zdalnego refspec tak, że zawsze popycha do pilota, który śledzisz:

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

Oto poprawa odpowiedzi: Greg Hewgill.

Utwórz skrypt gdzieś na drodze, jak na folderze bin profilu (utworzyć, jeśli to konieczne, nawet w systemie Windows):

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

o następującej treści:

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

Przypuśćmy, że utwórz gałąź śledzenia zdalnego, na przykład:

$ git checkout -b MyBranch origin/master 

Możesz po prostu zadzwonić pod numer:

$ git submit 

... aby w tym przypadku przesłać do refs/for/master.

Powiązane problemy