2012-07-23 10 views
6

मुझे डुप्लीकेट परिवर्तन खोजने के लिए एक नुस्खा चाहिए। पैच-आईडी समान होने की संभावना है लेकिन प्रतिबद्धता विशेषताएँ नहीं हो सकती हैं।गिट डुप्लिकेट कमिट्स (पैच-आईडी द्वारा)

Git पैच-आईडी --help

IOW, आप की संभावना डुप्लिकेट करता है देखने के लिए इस बात का उपयोग कर सकते हैं:

इस पैच-आईडी के लक्षित उपयोग हो रहा है।

मैं कल्पना है कि एक साथ stringing "Git लॉग", "Git पैच-id" और uniq बुरी तरह से काम कर सकता है, लेकिन अगर किसी को एक आदेश है कि काम अच्छी तरह से करता है है, मैं इसे सराहना करेंगे।

+0

यह एक आकर्षक विशेषता है। जिज्ञासा से, अतीत में कितनी दूर आप देखना चाहते हैं? मैं इसके लिए कुछ रचनात्मक एकीकरण उपयोग देख सकता था (यानी "मेरे योगदानकर्ता को नहीं पता कि कैसे रिबेस करना है"), लेकिन लंबे इतिहास से यह कम प्रभावी होगा ...? – Christopher

+0

यह मुद्दा एक शाखा के एक सप्ताह के लंबे इतिहास में दिखाई दिया, इसलिए मेरा उपयोग मामला काफी सभ्य था (गिट लॉग-पी पर्याप्त था)। पैच-आईडी टिप्पणी ने मुझे उत्सुकता दी हालांकि ... सभी इतिहास खोजना दर्दनाक हो सकता है। – bsb

उत्तर

10

क्योंकि डुप्लिकेट परिवर्तन (छोड़कर जब उन दोनों के बीच में वापस आ जाता है) एक ही शाखा पर नहीं होने की संभावना है, तो आप git cherry इस्तेमाल कर सकते हैं:

git cherry [-v] [<upstream> [<head> [<limit>]]] 

upstream कहाँ डुप्लिकेट की जांच करने के लिए शाखा होगा head में परिवर्तनों का।

2

मैं एक मसौदा कि एक खिलौना रेपो पर काम करता है, लेकिन के रूप में यह स्मृति में patch-> प्रतिबद्ध नक्शा रहता है यह बड़े रेपोस पर समस्याएं हो रही हों: प्रतिबद्ध की

जोड़े
# print commit pairs with the same patch-id 
for c in $(git rev-list HEAD); do \ 
    git show $c | git patch-id; done \ 
| perl -anle '($p,$c)[email protected];print "$c $s{$p}" if $s{$p};$s{$p}=$c' 

उत्पादन होना चाहिए उसी पैच-आईडी (3 डुप्लिकेट एबीसी "एबी" के रूप में बाहर आते हैं तो "बीसी")।

बदलें प्रतिबंधित करने के लिए प्रतिबद्ध जाँच Git रेव-सूची आदेश:

git log --format=%H HEAD somefile 

संलग्न "| xargs Git शो" में विस्तार से करता देखने के लिए, या "| xargs Git शो -s --oneline "एक सारांश के लिए:

0569473 add 6-8 
5e56314 add 6-8 again 
bece3c3 comment 
e037ed6 add comment again 

यह पता चला पैच-आईडी अपने मूल मामले में काम नहीं किया के रूप में वहाँ है कि में अतिरिक्त परिवर्तन बाद में प्रतिबद्ध थे। "गिट लॉग-एस" अधिक उपयोगी था।

+0

यदि आप किसी प्रतिबद्धता और उसके माता-पिता के बीच कच्चे अंतर पर देखना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं जैसे 'git diff $ c ~ 1 $ c | गिट पैच-आईडी'। यह मर्ज काम पर misbehave जा रहा है। माता-पिता दोनों विलय के बाद एक और जटिल समस्या है। – Christopher

+0

ऐसा लगता है जैसे पैच-आईडी एक ही diff पाता है? $ git diff HEAD ~ 1 HEAD | गिट पैच-आईडी 3318362fa07e580 .. 000000000000 .. $ गिट शो हेड | गिट पैच-आईडी 3318362fa07e580 .. c397c4cdc426 .. – bsb

+0

@bsb क्या आप वाकई 'गीट शो $ सी' लिखना चाहते हैं। गिट पैच-आईडी'? 'गिट शो' प्रिंट मेटाडेटा, लेकिन 'गिट पैच-आईडी' को इनपुट के रूप में पैच की आवश्यकता है ... –

7

किसी विशिष्ट प्रतिबद्धता के डुप्लिकेट की तलाश के लिए, यह आपके लिए काम कर सकता है।

पहले, लक्ष्य का पैच आईडी निर्धारित प्रतिबद्ध:

$ THE_COMMIT_REF_OR_SHA_YOURE_SEEKING_DUPES_OF='7a3e67c' 
$ git show $THE_COMMIT_REF_OR_SHA_YOURE_SEEKING_DUPES_OF | git patch-id 
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 7a3e67ce38dbef471889d9f706b9161da7dc5cf3 

पहले SHA पैच-आईडी है।इसके बाद, पैच आईडी सूची हर प्रतिबद्ध के लिए और किसी भी उस मैच को फ़िल्टर: सभी एक साथ

$ for c in $(git rev-list --all); do git show $c | git patch-id; done | grep 'f6ea51cd6acd30cd627ce1a56e2733c1777d5b52' 
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 5028e2b5500bd5f4637531e337e17b73f5d0c0b1 
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 7a3e67ce38dbef471889d9f706b9161da7dc5cf3 
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 929c66b5783a0127a7689020d70d398f095b9e00 

, कुछ अतिरिक्त झंडे के साथ, और एक utility script के रूप में:

test ! -z "$1" && TARGET_COMMIT_SHA="$1" || TARGET_COMMIT_SHA="HEAD" 

TARGET_COMMIT_PATCHID=$(
git show --patch-with-raw "$TARGET_COMMIT_SHA" | 
    git patch-id | 
    cut -d' ' -f1 
) 
MATCHING_COMMIT_SHAS=$(
for c in $(git rev-list --all); do 
    git show --patch-with-raw "$c" | 
     git patch-id 
done | 
    fgrep "$TARGET_COMMIT_PATCHID" | 
    cut -d' ' -f2 
) 

echo "$MATCHING_COMMIT_SHAS" 

उपयोग:

$ git list-dupe-commits 7a3e67c 
5028e2b5500bd5f4637531e337e17b73f5d0c0b1 
7a3e67ce38dbef471889d9f706b9161da7dc5cf3 
929c66b5783a0127a7689020d70d398f095b9e00 

यह बहुत तेजी से नहीं है, लेकिन सबसे रेपोस के लिए काम करवाने चाहिए (सिर्फ 826 प्रतिबद्ध के साथ एक रेपो और एक 158MB एक 2.4GHz पर .git निर्देशिका के लिए 36 सेकंड मापा कोर 2 डुओ)

(1) git show, जो git diff-tree --cc चलाता है के बजाय, आदेश का उपयोग करना चाहिए

git diff-tree -p 

अन्यथा git patch-id नकली अशक्त SHA1 हैश उत्पन्न करता है:

+0

के साथ परीक्षण किया गया मैं अकेला भ्रमित हो सकता हूं, लेकिन अगर "लक्ष्य-प्रतिबद्ध" एक शाब्दिक नहीं है; उस प्रतिबद्धता के SHA के साथ इसे प्रतिस्थापित करें जिसके लिए आप पैच आईडी प्राप्त करना चाहते हैं। – Jimothy

+1

@ जिमोथी येप, या शाखा का नाम या टैग नाम (कोई भी रेफरी, मुझे लगता है)। मैं देखूंगा कि क्या मैं इसे थोड़ा स्पष्ट कर सकता हूं। –

2
bsb ने सुझाव दिया गंधा आदेश

छोटे-मोटे सुधार की एक जोड़ी की आवश्यकता है ।

(2) जब पाइप xargs पर उपयोग किया जाता है, xargs-L 1 तर्क होना चाहिए। अन्यथा एक तिहाई प्रतिबद्धता को समान प्रतिबद्धता के साथ जोड़ा नहीं जाएगा।

यहाँ एक उपनाम है ~/.gitconfig में जाने के लिए:

dup = "!f() { for c in $(git rev-list HEAD); do git diff-tree -p $c | git patch-id; done | perl -anle '($p,$c)[email protected];print \"$c $s{$p}\" if $s{$p};$s{$p}=$c' | xargs -L 1 git show -s --oneline; }; f" # "git dup" lists duplicate commits 
0

$hash प्रतिबद्ध की डुप्लीकेट प्रतिबद्ध खोजने के लिए, मर्ज को छोड़कर करता है: किसी मर्ज की डुप्लीकेट प्रतिबद्ध $mergehash खोज के लिए

git rev-list --no-merges --all | xargs -r git show | git patch-id \ 
    | grep ^$(git show $hash|git patch-id|cut -c1-40) | cut -c42-80 \ 
    | xargs -r git show -s --oneline 

, की जगह द्वारा दिए गए दो पैच आईडी (1 कॉलम) में से एक द्वारा ऊपर $(git show $hash|git patch-id|cut -c1-40)। वे अपने दो माता-पिता के साथ विलय प्रतिबद्धता के अंतर से मेल खाते हैं।

सभी प्रतिबद्ध के डुप्लिकेट खोजने के लिए, मर्ज को छोड़कर करता है:

git rev-list --no-merges --all | xargs -r git show | git patch-id \ 
    | sort | uniq -w40 -D | cut -c42-80 \ 
    | xargs -r git log --no-walk --pretty=format:"%h %ad %an (%cn) %s" --date-order --date=iso 

डुप्लिकेट करता लिए खोज बढ़ाया या git rev-list के तर्क को बदलने, जो कई विकल्प स्वीकार करता है के द्वारा सीमित किया जा सकता है। उदाहरण के लिए, किसी विशिष्ट शाखा में खोज को सीमित करने के लिए --all विकल्प के बजाय उसका नाम निर्दिष्ट करें; या पिछले 100 कामों में खोज करने के लिए तर्क HEAD ^HEAD~100 पास करें।

ध्यान दें कि ये आदेश तेज हैं क्योंकि वे कोई शेल लूप का उपयोग नहीं करते हैं, और बैच-प्रक्रिया करता है।

मर्ज कमेट्स को शामिल करने के लिए, --no-merges विकल्प को हटाएं, और xargs -r -L1 git diff-tree -m -p द्वारा प्रतिस्थापित करें। यह बहुत धीमा है क्योंकि प्रति प्रतिबद्धता के बाद git diff-tree निष्पादित किया जाता है।

स्पष्टीकरण:

  • पहली पंक्ति के लिए प्रतिबद्ध हैश के साथ पैच आईडी की एक नक्शा उत्पन्न करता है (2-स्तंभ डेटा, प्रत्येक 40 अक्षरों की)।

  • दूसरी पंक्ति केवल डुप्लिकेट पैच आईडी (1 कॉलम) से संबंधित हैश (2 कॉलम) रखती है।

  • अंतिम पंक्ति डुप्लिकेट प्रतिबद्धताओं के बारे में कस्टम जानकारी प्रिंट करती है।

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