लेखक को बदलने के लिए Git में कई कमियों में संशोधन कैसे करें


180

मैंने गिट में कमिट्स की एक श्रृंखला बनाई है और मुझे अब एहसास हुआ कि मैं अपने उपयोगकर्ता नाम और उपयोगकर्ता ईमेल गुणों को सही तरीके से सेट करना भूल गया (नई मशीन)। मैंने अभी तक इन कमिटों को अपनी रिपॉजिटरी में नहीं धकेला है, इसलिए मैं ऐसा करने से पहले इन कमेंट्स को कैसे सही कर सकता हूं (केवल मास्टर ब्रांच पर 3 लेटेस्ट कमिट्स)?

मैं देख रहा हूँ git resetऔर git commit -C <id> --reset-author, लेकिन मुझे नहीं लगता कि मैं सही रास्ते पर हूँ।


1
एक और कारण हो सकता है कि आप ईमेल प्रॉपर्टी को बदलना चाहें, यह गितुब त्रुटि है: remote: error: GH007: Your push would publish a private email address.... `! [दूरस्थ अस्वीकृत] मास्टर -> मास्टर (ईमेल गोपनीयता प्रतिबंधों के कारण धक्का दिया गया) `।
सनक

इसके अलावा stackoverflow.com/q/750172/1340631 देखें ।
स्काइ

जवाबों:


232

जब आप अपनी उंगलियों पर फ़िल्टर-शाखा की शक्ति रखते हैं, तो रिबेस / संशोधन अक्षम लगता है:

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(स्पष्टता के लिए लाइनों में विभाजन, लेकिन आवश्यक नहीं)

जब आप कर रहे हों तो परिणाम का निरीक्षण करना सुनिश्चित करें, यह सुनिश्चित करने के लिए कि आपने कुछ भी नहीं बदला जिसका आप मतलब नहीं था!


मन यह थोड़ा और अधिक समझा? निश्चित नहीं है कि फ़िल्टर शाखा क्या है
अधिकतम प्लीनर

1
@ मैक्सप्लीनर git filter-branch --helpबहुत सीधा साधा है :)
एलेडियाफरिया

3
help.github.com/articles/changing-author-info भी देखें , जो नए इतिहास में टैग्स को माइग्रेट करने के लिए भी जोड़ता --tag-name-filter catहै filter-branch। इसके --branches --tagsबजाय इसका उपयोग भी किया जाता है --all, जो केवल शाखा और टैग इतिहास को फिर से लिखता है और अन्य को refsअकेला छोड़ देता है (हालांकि जब तक आप उपयोग नहीं कर रहे हैं तब तक इससे बहुत फर्क नहीं पड़ता है git-notes)
टोबियास किंजलर

12
पर इस प्रदर्शन करने के लिए सिर्फ पिछले दो कमिट, मैं प्रतिस्थापित -- --allसाथHEAD~1..HEAD
nmz787

1
@ nmz787 यदि आप करते हैं तो कितने लॉग दिखाए जाते हैं git log HEAD~2..HEAD?
जोना

148

निष्पादन के साथ संयोजन के रूप में उपयोग किए जाने पर इंटरैक्टिव रिबास दृष्टिकोण बहुत अच्छा है। आप किसी विशिष्ट आदेश के खिलाफ कोई भी शेल कमांड चला सकते हैं या रिबास में सभी कमिट कर सकते हैं।

सबसे पहले अपनी git ऑथर सेटिंग सेट करें

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

फिर दिए गए SHA के बाद सभी कमिट के लिए लेखक को रीसेट करें

git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

यह परिवर्तनों की पुष्टि करने के लिए आपके संपादक को पॉप अप करेगा। यहां आपको बस इतना करना है कि बचत करें और छोड़ दें और यह प्रत्येक प्रतिबद्ध के माध्यम से जाएगा और -x ध्वज में निर्दिष्ट कमांड को चलाएगा।

नीचे दवे की टिप्पणी के अनुसार, आप मूल टाइमस्टैम्प को बनाए रखते हुए लेखक को भी बदल सकते हैं:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"

3
मुझे -x विकल्प में पेश करने के लिए धन्यवाद। इसका कमाल! -i विकल्प के लिए मैंने अपने अंतिम 4 कमिट पर अपना ईमेल पता ठीक करने के लिए HEAD ~ 4 का उपयोग किया। एक जादू की तरह काम किया।
ब्रैड हेन

2
यह बहुत आसान है filter-branchअगर आप बस अपने पिछले आवागमन को ठीक करना चाहते हैं :)। हालाँकि, ध्यान दें कि इससे आवागमन का समय बदल जाता है।
ल्युकेटर

24
लेखक को बदलने के लिए लेकिन मूल टाइमस्टैम्प को बनाए रखने के लिए, उपयोग करेंgit rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
डेव

2
@ कोनोर git logने मेरे लिए पुराने लेखकत्व को भी दिखाया, लेकिन git स्टेटस ने सही ढंग से नए कमिट्स की पहचान की और फोर्स पुश के बाद वे जैसा कि मेरा इरादा था।
दान एम।

6
रूट उपयोग सहित सभी कमिट्स को रिबेट करने के लिए: git rebase -i --root …एसएचए पास करने के बजाय।
gfullam

80

केवल लेखक को अंतिम वचन में बदलने के लिए:

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

मान लीजिए कि आप केवल अंतिम एन के लिए लेखक को बदलना चाहते हैं:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

टिप्पणियाँ

  • --no-editझंडा बनाता है यकीन है कि git commit --amendएक अतिरिक्त पुष्टि नहीं पूछता है
  • जब आप उपयोग करते हैं git rebase -i, तो आप मैन्युअल रूप से कमिट का चयन कर सकते हैं कि लेखक को कहां बदलना है,

आपके द्वारा संपादित फ़ाइल इस तरह दिखाई देगी:

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix

1
जड़ से सभी के लिए प्रतिबद्ध है। git rebase -i --root UPTO_COMMIT_SHA -x "git कमिट --amend --author 'NEW_CHANGE' --no-edit"
आशीष नेगी

1
मैं अपनी शाखा की टोपोलॉजी को बरकरार रखने के लिए --rebase-merges(संक्षिप्त -r) विकल्प जोड़ने की सलाह देता हूं , यदि इसमें कुछ विलय हैं।
दान

4

इस विधि को इस उद्देश्य के लिए गिथब द्वारा प्रलेखित किया गया था। कदम हैं:

  1. टर्मिनल खोलें और अपने रेपो का एक नंगे क्लोन बनाएं
git clone --bare https://github.com/user/repo.git
cd repo
  1. संपादित करें निम्न स्क्रिप्ट (जगह OLD_EMAIL, CORRECT_EMAILऔर CORRECT_NAME)
#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
  1. अपने टर्मिनल में स्क्रिप्ट को कॉपी / पेस्ट करें और इसे चलाने के लिए एंटर दबाएं।
  2. के साथ अपने परिवर्तन धक्का git push --force --tags origin 'refs/heads/*'और आप कर रहे हैं!

मैंने GitHub पर उसी निर्देशों का पालन किया जिसे आपने संदर्भित किया था, और GitHub अभी दिखता है। फिर भी, मैं एक Git newb हूं और सुनिश्चित नहीं हूं कि अपने स्थानीय रेपो को उसके बाद कैसे सिंक किया जाए। जब मैं खींचता हूं तो मुझे एक और उत्तर में उल्लिखित त्रुटि "असंबंधित इतिहास को मर्ज करने से इनकार" मिलता है। मुझे लगता है कि मुझे उस नए प्रतिबद्ध इतिहास के खिलाफ विद्रोह करने की आवश्यकता है, लेकिन मैं और अधिक विशिष्ट कदमों की सराहना करूंगा।
एनगमेंट 23

@enigment अगर आप रेपो के रूप में यह GitHub पर है के साथ खुश हैं, तो आप नष्ट कर सकते हैं (या शायद किसी अन्य स्थान पर ले जाते हैं) आप GitHub से स्थानीय स्तर पर और बस क्लोन है फ़ोल्डर
stevec

धन्यवाद, मुझे पता है, लेकिन यह मुहावरेदार GitHub / Git तरह नहीं लगता है।
एनगैमेंट

2

मुझे विश्वास है कि आप जो खोज रहे हैं वह है git rebase --interactive

यह आपको एक विशिष्ट कमिट पर रीसेट करने की अनुमति देता है और फिर इतिहास को जोड़ने या समूहन को बदलने के लिए फेंक देता है

यहां आपको एक स्पष्टीकरण https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase है -interactive


0

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

git reset HEAD~ (अंतिम प्रतिबद्ध पूर्ववत करें)

git config --global user.name "Your Name"

git config --global user.email you@example.com

git commit -m "message"

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