2012-04-05 7 views
23

किसी भी विलय संघर्ष के लिए मैं गिट स्वचालित रूप से git mergetool कैसे चला सकता हूं? यह सभी का आपस में विलय के लिए आवेदन merge, rebase, pull, का उपयोग करते हुए करना चाहिए आदिमर्ज विवाद होने पर मैं गेट को स्वचालित रूप से मेर्जेटूल कैसे खोलूं?

+1

शायद आप एक [githook] (http://www.kernel.org/pub/software/scm/git/docs/githooks.html) का उपयोग कर सकते हैं, उदा। 'पोस्ट-चेकआउट' (मुझे नहीं पता कि यह वास्तव में विलय के दौरान बुलाया गया है। 'पोस्ट-मर्ज' के लिए एक सफल विलय की आवश्यकता है) –

+1

@TobiasKienzler आप कुछ पर हो सकते हैं। यदि आप एक समाधान समाधान का पता लगा सकते हैं तो मैं आपको इस प्रश्न के लिए बक्षीस दूंगा। –

+0

@QuinnStrahl मुझे नहीं लगता कि वर्तमान में एक हुक मौजूद है जिसे मर्ज करने के लिए विभिन्न विभिन्न आदेशों से पहले निष्पादित किया गया है, इसलिए [rospov's wrapper] (http://stackoverflow.com/a/17620046/321973) शायद सबसे आसान समाधान। एक 'प्री-मर्ज' हुक कार्यक्षमता को लागू करने के लिए गिट स्रोत को संशोधित करना या संशोधित करना, इस मामले में आप निश्चित रूप से कॉन्फ़िगरेशन सेटिंग के आधार पर विवादों पर गिट रन मेरेटूल कर सकते हैं ... –

उत्तर

3

तुम हमेशा उर्फ ​​इस्तेमाल कर सकते हैं

alias 'git-merge'='git merge && git mergetool' 
alias 'git-rebase'='git rebase && git mergetool' 
alias 'git-pull'='git pull && git mergetool' 

और/या इन पंक्तियों के साथ एक सहायक पटकथा लिखने

#/bin/bash 
git $* 
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool 

और तो

alias git='~/.git/git-script' 

वहां है मर्जेटूल का आह्वान करने का कोई सीधा तरीका नहीं है, क्योंकि यह मर्ज करने के कई तरीकों में से एक है (देखें "मैन 1 गिट-मर्ज में" कॉन्फ़्लिक्ट कैसे हल करें "देखें।

+3

जैसा कि मैंने उल्लेख किया है, अगर कोई संघर्ष हो तो मैं केवल 'mergetool' को कॉल करना चाहता हूं। तर्क "विलय करने के कई तरीकों में से केवल एक" तर्कसंगत नहीं है। हां, कई तरीके हैं, लेकिन डिफ़ॉल्ट रूप से एक को चुनना उचित है। –

+1

गिट मेरेटूल कोई संघर्ष नहीं होने पर कुछ भी नहीं करेगा। – j13r

+2

यह एक संदेश प्रिंट करेगा। –

2

जहां तक ​​मुझे पता है, ऐसा करने के लिए कोई पोर्सिलीन तरीका नहीं है।

आप इस तरह Git के चारों ओर एक आवरण हो सकता है (फ़ाइल git_mergetool.sh अपने रास्ते पर,, +x):

echo alias git=\"git_mergetool.sh\" >> ~/.bashrc 

हर बार जब आप Git आह्वान, आवरण:

#!/bin/bash 

SEARCH="CONFLICT" 
OUTPUT=$(git "[email protected]" 2>&1 | tee /dev/tty) 
if `echo ${OUTPUT} | grep -i "${SEARCH}" 1>/dev/null 2>&1` 
then 
    git mergetool 
fi 

फिर अन्य नाम जोड़ें जांच करेगा कि "CONFLICT" शब्द पॉप अप करता है या नहीं। अगर ऐसा होता है - रैपर मेर्जेटूल लॉन्च करता है। (जैसे "स्वत: मर्ज विफल; संघर्ष को ठीक करने और उसके बाद परिणाम के लिए प्रतिबद्ध।")

यह $SEARCH को और अधिक सटीक वाक्यांश जोड़कर सुधार किया जा सकता है, तो पहला तर्क ($1) जिसके परिणामस्वरूप आदेशों की सूची में है की जाँच करके और साथ ही संघर्ष विलय में (pull, merge, आदि ...)। अन्यथा यदि गिट कमांड आउटपुट बहुत लंबा है तो आप बहुत सारे अनावश्यक डेटा को पार्स कर देंगे।

+0

क्या यह प्रभावी ढंग से गठबंधन के बिना संभव है? –

+0

@QuinnStrahl आप स्क्रिप्ट 'git' (फ़ाइल एक्सटेंशन के बिना) नाम दे सकते हैं और वास्तविक गिट निष्पादन योग्य से पहले अपने पथ पर डाल सकते हैं। लेकिन यह अलियासिंग का एक और तरीका है। तो नहीं, मुझे गिट के बिना इसे पूरा करने के तरीके को नहीं पता है। –

+2

कुछ हद तक काम करने योग्य होना चाहिए, लेकिन CONFLICT regex में सुधार की आवश्यकता है। मुझे लगता है कि यह वर्तमान में इसे कहीं भी उठाएगा, यहां तक ​​कि उदा। diff आउटपुट। कम से कम आप लाइन स्थिति (उदा। एक एंकर) द्वारा फ़िल्टर कर सकते हैं, और शायद टेक्स्ट का विस्तार कर सकते हैं। –

5

आप (अभी तक) गिट ऐसा नहीं कर सकते हैं।


यह स्वीकार्य कामकाज हो सकता है या नहीं भी हो सकता है।

अपने ~/.bashrc में एक समारोह बनाएँ:

git() 
{ 
    if [[ $1 == "merge" ]] || [[ $1 == "rebase" ]] || [[ $1 == "pull" ]]; then 
    command git "[email protected]" 
    rc=$? 
    if [[ $rc == 1 ]]; then 
     echo "There are conflicts, better run git-mergetool!!!" 
     # There might be some other condition that returns a '1', 
     # if so you can add another check like this: 
     # if grep Conflicts $(git --git-dir)/MERGE_MSG; 
     command git mergetool 
    fi 
    else 
    command git "[email protected]" 
    fi 
} 

Mergetool लागू नहीं है जब यह विलीन हो जाती है:

$ git merge conflicting_branch 
Auto-merging foo 
CONFLICT (content): Merge conflict in foo 
Automatic merge failed; fix conflicts and then commit the result. 
There are Conflicts, better run git-mergetool!!! 

Mergetool:

$ git merge non_conflicting_branch 
Merge made by the 'recursive' strategy. 
bar | 0 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 bar 

Mergetool जब वहाँ संघर्ष कर रहे हैं कहा जाता है अन्य त्रुटियों पर नहीं कहा जाता है:

$ git merge adasds 
fatal: adasds - not something we can merge 
+0

यह गिट स्वचालित रूप से खुले मर्जेटूल नहीं बना रहा है, यह खोल बना रहा है। –

+0

डाउनवोट क्यों? रोसीपोव के जवाब को लागू करने के लिए यह अनिवार्य रूप से एक क्लीनर तरीका है। – onionjake

+0

यह क्लीनर कैसा है? आप कुछ प्रकार के संघर्ष खो रहे हैं (जैसे 'गिट स्टैश पॉप')। चूंकि वह कमांड द्वारा फ़िल्टर नहीं करता है, यह कोई मुद्दा नहीं है। जैसा कि आप स्वयं को नोट करते हैं, वर्तमान कोड किसी भी त्रुटि पर किसी भी त्रुटि पर 'गिट mergetool' लॉन्च करेगा। –

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

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