2009-02-09 9 views
34

Git क्लोन के बाद, नए रेपो में config की तरह दिखता है:Git को कैसे कॉन्फ़िगर आकस्मिक Git धक्का से बचने के लिए

remote.origin.url=<some url> 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 

फिर, मैं निष्पादित कर सकते हैं "Git खींच" और "Git धक्का"। लेकिन मुझे केवल "गिट पुल" करने में दिलचस्पी है, क्योंकि मैं एक और रेपो में धक्का देना चाहता हूं।

एक बात मैं क्या कर सकते हैं:

git add remote repo-for-push <some other url> 
git push repo-for-push master 

लेकिन मैं पुल और धक्का, यानी के लिए डिफ़ॉल्ट और विशिष्ट रिपोजिटरी प्रयोग Git कॉन्फ़िगर करने के लिए करना चाहते हैं:

git pull # pulls from origin 
git push # pushes into repo-for-push, avoiding accidental push into the origin 

इस विन्यस्त किया जा सकता कैसे ? अग्रिम धन्यवाद।

संपादित करें:
असल में, मैं डिफॉल्ट पुश रेपो को डिफ़ॉल्ट fetch/pull repo से अलग करने के लिए सेट करना चाहता हूं।

+0

डिफ़ॉल्ट पुश रेपो डिफ़ॉल्ट fetch/पुल repo से अलग होने के लिए, सही है? शायद आपको इसे स्पष्ट करना चाहिए। – kch

+2

दाएं, यह वही है लेकिन कम शब्दों के साथ, :) –

उत्तर

34

लगता

git config remote.origin.receivepack /bin/false 

की तरह बनाता है दूरस्थ मूल करने के लिए धक्का असफल।

+0

ग्रेट !!!! यही वही है जो मैं ढूंढ रहा था। –

+0

कुछ प्रोटोकॉल केवल पढ़ने के लिए हैं? इससे गलत भंडार में भी दबाव डालना पड़ेगा। –

+0

@Andrew: ठीक है, अगर आप गिट प्रोटोकॉल के माध्यम से क्लोन करते हैं, तो आप सेट हो जाएंगे। – Cascabel

7

मुझे यकीन नहीं है कि आप वास्तव में आज गिट में ऐसा कर सकते हैं। गिट-फ़ेच (बिल्टिन-fetch.c में) और गिट-पुश (बिल्टिन-पुश.c में) दोनों का कार्यान्वयन आंतरिक फंक्शन रिमोट_get (एनयूएलएल) को पुल-टू-पुश-टू-टू-डिफॉल्ट रिपोजिटरी की पहचान करने के लिए कॉल करता है।

एक विकल्प एक उपनाम बनाना होगा जो आपके वांछित रेपो निर्दिष्ट करता है। उदाहरण के लिए:

git config --add alias.mypush "push repo-for-push" 

तो आप:

git mypush 

अपने वांछित रेपो के लिए पुश करने के लिए। बिल्कुल वही नहीं जो आप चाहते हैं। (आप धक्का देने के लिए --repo तर्क पर भी विचार कर सकते हैं; हालिया दस्तावेज़ अपडेट के लिए http://kerneltrap.org/mailarchive/git/2008/10/7/3537694 देखें जो --repo तर्क को स्पष्ट करता है।)

+0

"पुश रिपो-फॉर-पुश" और "पुश - रेपो रेपो-फॉर-पुश" के लिए दोनों उपनाम अच्छे कामकाज हैं। धन्यवाद। –

+0

जैसा कि @ नोवेलोक्रेट से उत्तर में उल्लेख किया गया है, 1.6.4 के रूप में यह अब सत्य नहीं है। –

0

यदि आप किसी अन्य शाखा से अपने सभी धक्का दे सकते हैं, तो मुझे लगता है कि आप कॉन्फ़िगर कर सकते हैं उस शाखा की अपनी अलग भंडार करने के लिए पुश करने के लिए है करने के लिए:

git checkout master 
git branch outbound 
git remote add destination <some url> 
git config branch.outbound.remote destination 

मैं इस प्रयास नहीं किया है, और आप एक पूर्ण समाधान बनाने के लिए कुछ अधिक काम करना पड़ सकता है। यदि आपको मास्टर से धक्का देना है तो यह आपके लिए भी काम नहीं करेगा।

+0

इस समाधान के साथ मुझे मैन्युअल रूप से दोनों शाखाओं को मर्ज करना होगा और धक्का xor गिट को ठीक से खींचने के लिए वर्तमान शाखा से अवगत रहना होगा। उपनामों से बेहतर नहीं, अगर मैं गिट को पुल/रोक/रोकने के लिए गिट को कॉन्फ़िगर करने में सक्षम नहीं हूं, तो वर्तमान शाखा सही नहीं है। धन्यवाद! –

+0

जैसा कि @ नोवेलोक्रेट के जवाब में उल्लेख किया गया है, अब इसकी आवश्यकता नहीं है। –

0

पुश तर्क खाने वाले किसी चीज़ में "गिट" कमांड को लपेटें।

 
~$ cat /usr/local/bin/git 
#!/bin/bash 

# git wrapper 
# prevents pushing to repository 

declare -a args 
declare msg='' 
while [ $# -gt 0 ] 
do 
    if [ "$1" != 'push' ]; then 
     args=("${args[@]}" "$1") 
    else 
     msg="No pushing" 
    fi 
    shift 
done 

if [ ${#msg} -gt 0 ]; then 
    echo "$msg" 
fi 
/usr/bin/git "${args[@]}" 

बस "असली" Git आदेश से पहले अपने पथ में लिपटे आदेश है के लिए सुनिश्चित हो: मेरे सिर के ऊपर से मैं इस लिखा था।

+0

अच्छा विचार है, लेकिन यह उपयोगकर्ता फाइल सिस्टम में होना चाहिए और इस प्रतिबंध के बिना कुछ रिपॉजिटरीज होने पर वर्तमान कार्यशील निर्देशिका की जांच करनी चाहिए। धन्यवाद। –

27

संस्करण 1.6.4 में, गिट ने remote.name.pushurl कॉन्फ़िगरेशन सेटिंग का उपयोग करके एक यूआरएल से रिमोट खींचने और दूसरे को धक्का देने की क्षमता प्राप्त की। मैं अजीब व्यवहार की कल्पना कर सकता हूं यदि पुश-रिपोजिटरी पुल-रिपोजिटरी को ट्रैक नहीं करती है, लेकिन मुझे संदेह है कि गिट केवल वर्तमान/ट्रैकिंग/मिलान करने वाली शाखा (एसएस) से पुश-रिपोजिटरी को तेज़ी से आगे बढ़ाने की कोशिश करेगा, इसके संबंध में जब वह उसी नाम के रिमोट से पूछता है तो खींच जाएगा।

उदाहरण के लिए

, आप गुमनाम Git प्रोटोकॉल के माध्यम से खींच, लेकिन SSH के माध्यम से धक्का (हो सकता है आप या एक SecurID टोकन बंद एक मूल्य के कुछ प्रमाणित करने के लिए की जरूरत है) करना चाहते थे: तो बुनियादी तौर पर आप सेटअप करना चाहते हैं

[remote "myremote"] 
    url = git://server/path 
    pushurl = [email protected]:/path