2011-08-18 7 views
17

मैं Gerrit Code Review के साथ गिट स्थापित कर रहा हूं और गिट के लिए नए उपयोगकर्ताओं के लिए जरूरी गिट कमांड को अपेक्षाकृत सरल बनाने के लिए एक तरीका ढूंढ रहा हूं।गेरिट के साथ उपयोग किए जाने पर गिट के लिए विशिष्ट अपस्ट्रीम पुश रेफस्पेक को कॉन्फ़िगर कैसे करें?

आदेशों एक नई सुविधा शाखा शुरू करने के लिए अनिवार्य रूप से कर रहे हैं मैं वर्तमान में है (यह मानते हुए Gerrit origin है):

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

यह एक नया काम पैकेज work1234 कुछ baseline से branched शुरू होता है, और अंतिम धक्का शाखा बनाता है गेरिट में और अपस्ट्रीम सेट करता है।

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

समीक्षा के लिए नई प्रतिबद्ध अब, Gerrit चाहता है के लिए एक विशेष refspec पर लाई जानी, उदाहरण के लिए refs/for/work1234: तो .git/config तरह दिखता है। मैं के साथ मैन्युअल रूप से कर सकते हैं:

git push origin work1234:refs/for/work1234 

मुझे क्या करना चाहते हैं .git/config स्थापित करने के लिए इतना है कि एक सादे git push दूरस्थ कि Gerrit की आवश्यकता पर refspec करने के लिए वर्तमान शाखा धक्का होगा किसी तरह लगता है। मैं निम्नलिखित git config क्षेत्रों पर ध्यान दिया है:

  • branch.<name>.* -
  • push.default refspec धक्का स्थापित करने के लिए किसी भी विशिष्ट विकल्प होता है प्रतीत नहीं होता है - मैं इन सबसे छुटकारा upstream यहाँ
  • remote.<name>.push चाहता हूँ - मैं refs/heads/*:refs/for/* की कोशिश की यहां पर git push हमेशा इस मामले में सभी स्थानीय शाखाओं को धक्का देना चाहता है, जबकि मैं सिर्फ वर्तमान शाखा

यदि मैं गिट को स्वयं ही ऐसा नहीं कर सकता, तो मैं एक छोटी रैपर स्क्रिप्ट लिखूंगा जो पूरी तरह से refspecs निर्दिष्ट करता है। हालांकि, यह बेहतर होगा अगर गिट सही जगह पर सही जगह पर धक्का दे सके।

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

उत्तर

9

मैं एक नया git-submit स्क्रिप्ट लिखने को समाप्त origin रिमोट नहीं, तो उपयुक्त के रूप में git submit <remote> का उपयोग करें।

+1

यदि मैं हमेशा एक निश्चित गंतव्य पर धक्का देना चाहता हूं, तो 'रिफ/के लिए/मास्टर' कहें तो एक आसान गिट-केवल समाधान होगा? ([यहां है] (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/config:

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

मैं वहाँ कहीं भी वहाँ में एक वाइल्डकार्ड डाल करने के लिए यह सभी शाखाओं के लिए काम करने के लिए कोई तरीका है यकीन नहीं है।

+0

यह तोड़ देगा 'गिट-पुल' के रूप में यह '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

यहाँ एक है ग्रेग हेगिल उत्तर में सुधार।

एक स्क्रिप्ट पथ पर कहीं बनाएं, अपने प्रोफ़ाइल बिन फ़ोल्डर पर की तरह (यदि आवश्यक एक बनाने के, यहां तक ​​कि Windows पर):

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

आप मान लें:

$ mkdir ~/bin 
$ vi ~/bin/git-submit 
निम्नलिखित सामग्री के साथ

$ git checkout -b MyBranch origin/master 

आप बस फोन कर सकते हैं: की तरह एक दूरस्थ ट्रैकिंग शाखा बनाने

$ git submit 

... इस मामले में refs/for/master पर धक्का देने के लिए।

संबंधित मुद्दे