2013-03-29 5 views
6

मैं ओपन सोर्स प्रोजेक्ट्स में विलय का अध्ययन करने के लिए एक शोध पर काम कर रहा हूं।मैं उन सभी विलयों को कैसे ढूंढ सकता हूं जिनके पास गिट भंडार में संघर्ष था?

मैंने हाल ही में How can I find all the commits that have more than one parent in a Git repository? से पूछा, और बहुत अच्छे जवाब मिल गए।

अब मुझे अपनी क्वेरी को केवल उन कामों को ढूंढने की आवश्यकता है जो संघर्ष करते थे।

विवादों के साथ मेरा मतलब है कि एक ही फ़ाइल दो योगदान करने वाली गतिविधियों में संशोधित की गई थी।

इसके अलावा, अगर मैं एक गिट या बैश (grep, awk?) कमांड पा सकता हूं तो यह बहुत उपयोगी होगा जो मुझे केवल उन लोगों को देता है जिनमें एक ही पंक्ति दो योगदानकर्ताओं द्वारा संशोधित की गई थी।

विचार उन चीजों को ढूंढना है जिन्हें स्वतः हल नहीं किया जा सकता है।

तो, मैं उन सभी विलयों को कैसे ढूंढ सकता हूं जिनके पास गिट रिपोजिटरी में संघर्ष था?

+0

मामले में किसी को भी रुचि है, मैं मर्क्युरियल के लिए एक ही सवाल भी पूछा: http://stackoverflow.com/questions/15707690/how-can-i-find-all-the-merges-that-had -conflicts-in-a-mercurial-repository – macrobug

उत्तर

4

एक बार विलय प्रतिबद्धता बनने के बाद, जानकारी कैसे विलय की गई थी दुर्भाग्य से खो गई है। यह महत्वपूर्ण है क्योंकि git merge कई विकल्पों को स्वीकार करता है, जैसे रणनीति और प्रति-रणनीति विकल्प, जो विवादों की उपस्थिति को प्रभावित करते हैं। हालांकि, यदि आपका लक्ष्य विलय खोजने के उचित मामले को कवर करना है में डिफॉल्ट मर्ज विकल्पों के साथ विवादों का उत्पादन होगा, तो इसे बलपूर्वक बल देना संभव है: विलय करने के लिए आगे बढ़ें, अपने विलय को फिर से बनाएं, और उन लोगों को ध्वजांकित करें जहां गिट रिपोर्ट्स

नोट: यह स्क्रिप्ट कई अलग-अलग काम करता है, और प्रत्येक पुनरावृत्ति में git reset --hard और यहां तक ​​कि git clean -fdx चलाता है। केवल इसे चेकआउट में चलाने के लिए सुनिश्चित करें जिसमें गिट के लिए अज्ञात कोई महत्वपूर्ण फाइल नहीं है!

#!/bin/bash 

old_branch=$(git symbolic-ref --short HEAD) 
for commit in `git rev-list --merges HEAD` 
do 
    # find the parents of the merge commit 
    parents=$(git log -1 --format=%P $commit) 
    fst=${parents%% *} 
    rest=${parents#* } 
    # check out the first parent 
    git checkout -q $fst 
    # merge with the rest of them 
    git merge --no-commit $rest >/dev/null 2>&1 
    # if there are any conflicts, print the commit and abort the merge 
    if git ls-files --unmerged | grep -q '^'; then 
    echo $commit 
    git merge --abort 
    fi 
    # get rid of changes so the next checkout doesnt complain 
    git reset -q --hard 
    git clean -fdxq 
done 
git checkout -q $old_branch 
+0

उपयोगकर्ता 4815162342 धन्यवाद! मुझे ठीक इसी की आवश्यकता थी। – macrobug

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

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