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


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


72
2018-05-26 20:56


मूल


हमारे भविष्य के पाठकों के लिए: उपयोग करने के बारे में प्रश्न git इस तरह के प्रयोजनों के लिए बेहतर पूछा जाता है स्टैक ओवरफ़्लो। - Michael Hampton♦
यहां सबसे नज़दीकी सवाल है stackoverflow.com पर। - naught101


जवाब:


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

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

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

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


80
2018-05-27 17:51



अच्छी तरह से, गिट फ़िल्टर-शाखा --env-filter 'निर्यात GIT_AUTHOR_EMAIL = "foo@example.com"; GIT_AUTHOR_NAME = "Foo" बहुत आसान है, धन्यवाद। अगर मैं इसे बदल सकता हूं तो यह स्वीकार्य उत्तर होगा (ऐसा लगता है कि सर्वर फॉल्ट के साथ एक बग है)। - Chas. Owens
ध्यान दें कि निर्यात लाइनों के बराबर चिह्न के दोनों तरफ रिक्त स्थान नहीं होना चाहिए। अर्थात। उन्हें इस तरह दिखना चाहिए: GIT_AUTHOR_EMAIL = "(सही ईमेल) निर्यात करें; - Andy Balaam
अब, मैं विंडोज़ पर यह कैसे करूं? - Carsten Schmitz
@ डेकार्ड: स्क्रिप्ट को एक टेक्स्ट फ़ाइल जैसे fixcommits.sh पर सहेजें, फिर गिट बैश चलाएं और स्क्रिप्ट चलाएं। मैंने स्क्रिप्ट फ़ाइल को मेरे रेपो की जड़ में रखा, फिर गिट बैश में उस फ़ोल्डर में नेविगेट किया, फिर मैंने स्क्रिप्ट को ./fixcommits.sh के साथ चलाया। - Avalanchis
परिशिष्ट 1 यह कमांड प्रारूप मेरे लिए काम नहीं कर रहा था, लेकिन अगर / तो किया: if [ "$GIT_AUTHOR_EMAIL" = "$oldemail" ]; then GIT_AUTHOR_EMAIL="$newemail"; fi - Josh M.


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

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

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

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

git shortlog -se

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

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

अब आप $ BRANCH $ $ BRANCH2 को फिर से लिखने के लिए आदेश जेनरेट करने के लिए गिट लॉग की स्वरूपण सुविधा का उपयोग कर सकते हैं।

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

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

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

[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

27
2017-07-29 10:54



यह कमाल का है। अगर मैं अधिक प्रतिनिधि था तो मैं आपको बक्षीस दूंगा। धन्यवाद :) - pistache


से जवाब का मिश्रण मैं गिट में पहली प्रतिबद्धता पर मेटाफॉर्मेशन कैसे ठीक करूं?

### 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

8
2018-05-27 16:45



मुझे सही रास्ते पर मिला, लेकिन से आवश्यक आदेश: stackoverflow.com/a/28536828/307 - प्राधिकृत उपयोग के बजाय - Brett Veenstra


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


4
2018-05-26 22:02