मैं गलत ईमेल पते / नाम को सही करने के लिए git के इतिहास को कैसे संपादित करूं [बंद]


76

जब मैंने git का उपयोग करना शुरू किया तो मैंने सिर्फ a किया git initऔर कॉल करना शुरू किया addऔर commit। अब मैं ध्यान देना शुरू कर रहा हूं और मैं देख सकता हूं कि मुझे cowens@localmachineजो पता चाहिए, उसके बजाय मेरे कमिट्स दिख रहे हैं। ऐसा प्रतीत होता है जैसे सेटिंग कर रहा हूं GIT_AUTHOR_EMAILऔर GIT_COMMITTER_EMAILवही करूंगा जो मैं चाहता हूं, लेकिन मेरे पास अभी भी गलत ईमेल पते / नाम के साथ पुराने कमिट हैं। मैं पुराने कमिट को कैसे सही कर सकता हूं?


4
हमारे भविष्य के पाठकों के लिए: gitइस तरह के उद्देश्यों के लिए उपयोग करने के बारे में प्रश्न स्टैक ओवरफ्लो पर बेहतर पूछे जाते हैं ।
माइकल हैम्पटन

जवाबों:


82

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

आप इस आदेश के साथ सभी गलत ईमेल को ठीक कर सकते हैं:

git filter-branch --env-filter '
    oldname="(old name)"
    oldemail="(old email)"
    newname="(new name)"
    newemail="(new email)"
    [ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
    [ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
    [ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname"
    [ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname"
    ' HEAD

अधिक जानकारी git डॉक्स से उपलब्ध है


11
अच्छी तरह से, git फ़िल्टर-शाखा --env-filter 'निर्यात GIT_AUTHOR_EMAIL = "foo@example.com"; GIT_AUTHOR_NAME = "फू" एक बहुत सरल है, धन्यवाद। यह स्वीकृत उत्तर होगा यदि मैं इसे बदल सकता हूं (ऐसा लगता है कि सर्वर दोष के साथ एक बग है)।
चास। ओवेन्स

7
ध्यान दें कि निर्यात लाइनों में बराबर चिह्न के दोनों ओर रिक्त स्थान नहीं होने चाहिए। यानी उन्हें इस तरह दिखना चाहिए: GIT_AUTHOR_EMAIL = "(सही ईमेल) निर्यात करें";
एंडी बालाम

1
अब, मैं विंडोज पर यह कैसे करूंगा?
कार्स्टन शमित्ज़

2
@ डीकॉर्ड: फ़िक्कमिट्स.श जैसी टेक्स्ट फ़ाइल में स्क्रिप्ट को सहेजें, फिर गिट बैश चलाएं और स्क्रिप्ट चलाएँ। मैंने स्क्रिप्ट फ़ाइल को अपने रेपो की जड़ में डाला, फिर उस फ़ोल्डर को Git Bash में नेविगेट किया, फिर मैंने स्क्रिप्ट को ./fixcommits.sh
Avalanchis

2
परिशिष्ट 1 यह कमांड प्रारूप मेरे लिए काम नहीं कर रहा था, लेकिन अगर / फिर किया गया:if [ "$GIT_AUTHOR_EMAIL" = "$oldemail" ]; then GIT_AUTHOR_EMAIL="$newemail"; fi
जोश एम।

28

Git की फ़िल्टर-शाखा कमांड शक्तिशाली है, लेकिन यह कुछ भी गैर-तुच्छ के लिए उपयोग करने के लिए बहुत ही बुरा है, उदाहरण के लिए, यदि आपके पास सही करने के लिए एक से अधिक लेखक हैं।

यहाँ एक विकल्प मुझे उपयोगी लगा, जो git-shortlog मैनपेज में वर्णित .mailmap फीचर का उपयोग करता है। यह एक लेखक मानचित्रण तंत्र प्रदान करता है जिसका उपयोग हम गिट लॉग की प्रारूपण सुविधा के साथ कर सकते हैं। हम इसका उपयोग कमानों के नामित अनुक्रम को चुनने और संशोधित करने के लिए आदेश उत्पन्न करने के लिए कर सकते हैं।

उदाहरण के लिए, मान लें कि आप एक शाखा $ BRANCH पर लेखक को सही करना चाहते हैं, एक प्रतिबद्ध $ START से शुरू।

आपको अपनी रिपॉजिटरी की शीर्ष निर्देशिका में एक .mailmap फ़ाइल बनाने की ज़रूरत है जो मौजूदा लेखक के नाम को सही करता है। आप मौजूदा लेखक नामों की एक सूची प्राप्त कर सकते हैं:

git shortlog -se

आपको इस तरह एक .mailmap फ़ाइल के साथ समाप्त करने की आवश्यकता है (कहते हैं):

You <you@somewhere.org>   cowens@localmachine
You <you@somewhere.org>   root@localmachine

अब आप $ BRANCH2 के रूप में $ BRANCH को फिर से लिखने के लिए कमांड जनरेट करने के लिए git log के फॉर्मेटिंग फीचर का उपयोग कर सकते हैं।

git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh - 

पहला कमांड प्रतिबद्ध $ $ से अंकुरित एक नई खाली शाखा बनाता है। $ START और फिर $ BRANCH के अंत के लिए प्रत्येक कमिटमेंट के लिए, दूसरी कमांड चेरी मूल शाखा को वर्तमान ब्रांच $ BRANCH2 के अंत में चुनती है, और लेखक को सही तरीके से सेट करने के लिए इसे संशोधित करती है।

यह भी आमतौर पर लागू होता है - इसे अपने ~ / .itconfig में डालें:

[alias]
    # git reauthor $START..$END
    reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H &&  git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '

इसलिए जब आपको लेखकों को सही करने की आवश्यकता होती है, तो अब आपको केवल एक .mapfile उत्पन्न करने और करने की आवश्यकता है:

git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH

मूल शाखा रेफ को नए के लिए फिर से असाइन किया जा सकता है, और नया हटा दिया गया है:

git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2

यह कमाल का है। अगर मैं और अधिक प्रतिनिधि होता तो मैं आपको इनाम देता। धन्यवाद :)
pistache

9

जवाब के संयोजन से कैसे मैं पहली बार Git में प्रतिबद्ध पर metainformation ठीक करते हैं?

### Fix the first commit ###    
# create a temporary tag for the root-most commit so we can reference it
git tag root `git rev-list HEAD | tail -1`
# check it out on its own temporary branch
git checkout -b new-root root
# amend the commit
git commit --amend --author "Foo foo@example.com"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# now you've changed the commit message, so checkout the original branch again
git checkout @{-1}
# and rebase it onto your new root commit
git rebase --onto new-root root
### Fix the rest of the commits ###
git rebase -i root
# edit the file to read "edit <commit number> for each entry
# amend the commit
git commit --amend --author "Foo foo@example.com"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# move to the next commit
git rebase --continue    
# continue running the last two commands until you see
# Successfully rebased and updated refs/heads/master.
### Clean up ###
# nuke the temporary branch we created
git branch -d new-root
# nuke the temporary tag we created
git tag -d root

मुझे सही रास्ते पर ले आया, लेकिन इसके लिए आवश्यक आदेश: stackoverflow.com/a/28536828/307
Brett Veenstra

5

जेडबर्ग के जवाब का पालन करने के लिए: आप rebase -iप्रश्न में कमिट्स को संपादित करने के लिए उपयोग कर सकते हैं और चुन सकते हैं । यदि आप उपयोग करते हैं git commit --amend --author <AUTHOR DETAILS>और तब git rebase continueआप इतिहास को ठीक कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.