2012-02-10 16 views
9

से किसी आकस्मिक डॉकिट से कैसे बच सकता हूं कभी-कभी, मैं गिट में स्थानीय शाखाएं बनाता हूं, और जब मैं उनसे डॉकिट करने का प्रयास करता हूं तो मैं एक चेतावनी संदेश प्राप्त करना चाहता हूं।मैं स्थानीय शाखा

मैं स्थानीय शाखा से गलती से डॉकिटिंग से खुद को कैसे रोक सकता हूं?

+0

नहीं निर्मित लेकिन एक विचार: जैसे ही आप शाखा, एक 'Git config --rename अनुभाग" SVN-remote.svn कर के रूप में "" नो-एसवीएन-रिमोट "'। एक बार जब आप डॉकिट करना चाहते हैं, तो आप इसे वापस कर सकते हैं। – vasquez

+0

या शायद मैं किसी भी तरह से निर्दिष्ट कर सकता हूं कि इस स्थानीय शाखा के लिए कोई अपस्ट्रीम शाखा नहीं है? क्या आप जानते हैं कि मैं यह कैसे कर सकता हूं? – greg0ire

+0

मैंने शोध किया कि आपके प्रश्न के प्रकाश में, लेकिन ऐसा लगता है कि गिट svn को स्थानीय शाखा स्विच नहीं मिलता है, इसलिए ऐसा लगता है कि यह अभी भी ट्रंक या चेकआउट आउट शाखा/टैग पर है। यह जांचने के लिए कॉन्फ़िगरेशन फ़ाइल में डिफ़ॉल्ट शाखा रेखा को बदलने का प्रयास करने योग्य हो सकता है। – vasquez

उत्तर

8

यदि आप लिनक्स (या गिट बैश या सिगविन या इसी तरह) का उपयोग कर रहे हैं, तो पूर्व-प्रतिबद्ध हुक के लिए एक विकल्प, शेल हेल्पर फ़ंक्शन में git को लपेटना है।

real_git=$(which git) 
function git { 
    if [[ ($1 == svn) && ($2 == dcommit) ]] 
    then 
     curr_branch=$($real_git branch | sed -n 's/\* //p') 
     if [[ ($curr_branch != master) && ($curr_branch != '(no branch)') ]] 
     then 
      echo "Committing from $curr_branch; are you sure? [y/N]" 
      read resp 
      if [[ ($resp != y) && ($resp != Y) ]] 
      then 
       return 2 
      fi 
     fi 
    fi 
    $real_git "[email protected]" 
} 

(मैं पार्टी और रेड हैट पर zsh के साथ इस परीक्षण किया है: या ~/.zshrc (zsh के लिए) फ़ाइल, या जो कुछ भी बराबर अपने खोल के लिए है (bash, Git बैश के लिए) अपने ~/.bashrc लिए नीचे दिए गए जोड़ें , और सिगविन पर बैश)

जब भी आप git पर कॉल करते हैं, तो आप अब सामान्य बाइनरी के बजाय इस फ़ंक्शन को कॉल करेंगे। फ़ंक्शन सामान्य रूप से गिट चलाएगा, जब तक कि आप मास्टर नहीं हैं, तब तक git svn dcommit पर कॉल करते समय। उस स्थिति में, यह आपको प्रतिबद्ध करने से पहले पुष्टि करने के लिए संकेत देगा। आप git को स्पष्ट रूप से पथ निर्दिष्ट करके फ़ंक्शन को ओवरराइड कर सकते हैं (यही वह है जो $real_git कर रहा है)।

याद रखें कि ~/.bashrc या समकक्ष अद्यतन करने के बाद, आपको एक नया खोल सत्र (लॉग आउट करना और फिर से लॉग इन करना) या source ~/.bashrc चलाकर इसे फिर से लोड करना होगा।

संपादित: एक वृद्धि के रूप में, आप पहली पंक्ति को हटा सकते हैं, real_git= शुरू करने, और command git है, जो एक ही बात को प्राप्त होता है के साथ लेकिन पसंदीदा तरीका में $real_git के अन्य उदाहरण की जगह। मैंने स्क्रिप्ट को स्वयं अपडेट नहीं किया है क्योंकि मैं zsh पर परिवर्तन का परीक्षण करने में सक्षम नहीं हूं।

+0

संयोग से, यदि आप यह जांचना चाहते हैं कि यह कैसे काम करता है, तो 'git svn dcommit --dry-run' एक ही जांच व्यवहार को 'git svn dcommit' के रूप में ट्रिगर करेगा, वास्तव में प्रतिबद्धता को स्वयं करने की कोशिश किए बिना। –

+0

मैं linux + zsh का उपयोग कर रहा हूं, आपका समाधान मेरे अनुकूलन के लिए बहुत कठिन नहीं होना चाहिए, मैं कोशिश करता हूं कि जब मैं कर सकूं। – greg0ire

+0

मैंने उपर्युक्त परीक्षण zsh में किया है; यह मेरे लिए ठीक काम करता है। बस कोड को ~ ~/.zshrc' में डालें। –

2

पहली बात जो दिमाग में आती है वह समस्या को हल करने के लिए एक गिट प्री-प्रतिबद्ध हुक का उपयोग कर रही है।

लेकिन जैसे Hooks for git-svn में चर्चा की, यह पूरी तरह से काम नहीं कर रहा है। VonC एक (स्वीकृत) answer के साथ आया जहां वह एक मध्यवर्ती नंगे रेपो का उपयोग करता है जो गिट उत्तर एसवीएन के बीच प्रॉक्सी की तरह कार्य करता है।

शायद यह आपकी भी मदद कर सकता है।

+0

दूसरा लिंक वादा करता है।+1 – greg0ire

0

किसी और मामले किसी में Windows PowerShell के लिए इस की जरूरत है:

function CallGit 
    { 
     if (($args[0] -eq "svn") -And ($args[1] -eq "dcommit")) { 
      $curr_branch = &{git branch}; 
      $curr_branch = [regex]::Match($curr_branch, '\* (\w*)').captures.groups[1].value 
      if ($curr_branch -ne "master") { 
       Write-Warning "Committing from branch $curr_branch"; 
       $choice = "" 
       while ($choice -notmatch "[y|n]"){ 
        $choice = read-host "Do you want to continue? (Y/N)" 
       } 
       if ($choice -ne "y"){ 
        return 
       } 
      } 
     } 
     &"git.exe" @args 
    } 
    Set-Alias -Name git -Value CallGit -Description "Avoid an accidental git svn dcommit on a local branch" 
संबंधित मुद्दे