Git, पिछले प्रतिबद्ध उपयोगकर्ता नाम और ईमेल को फिर से लिखना


170

मैंने गितुब पर एक परियोजना के लिए कमिट्स का एक समूह बनाया है, हालांकि मुझे एहसास हुआ कि मैंने कंप्यूटर पर उचित ईमेल और कम्यूटर का पूरा नाम सेट नहीं किया है जिसका उपयोग मैं वर्तमान में अपने कॉमेट्स बनाने के लिए कर रहा हूं और इसलिए उपयोगकर्ता अवतार और ईमेल पता वहां नहीं हैं।

मैं पिछले सभी प्रतिबद्ध ईमेल और उपयोगकर्ता नाम फिर से कैसे लिख सकता हूं?



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

जवाबों:


243

आप इस उपनाम को जोड़ सकते हैं:

git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "

लेखक का नाम बदलने के लिए:

git change-commits GIT_AUTHOR_NAME "old name" "new name"

या केवल अंतिम 10 के लिए ईमेल करता है:

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

उपनाम:

change-commits="!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \$@; }; f "

स्रोत: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig


13
इसके अलावा git change-commits GIT_COMMITTER_EMAIL "old@example.com" "new@example.com"कमिट ईमेल को बदलने के लिए।
लौरेंट

19
ubuntu पर "eval: [[: नहीं मिला" के लिए तय किया गया है और एक पुष्टि जोड़ेंchange-commits = "!f() { VAR1=$1; VAR='$'$1; OLD=$2; NEW=$3; echo \"Are you sure for replace $VAR $OLD => $NEW ?(Y/N)\";read OK;if [ \"$OK\" = 'Y' ] ; then shift 3; git filter-branch --env-filter \"if [ \\\"${VAR}\\\" = '$OLD' ]; then export $VAR1='$NEW';echo 'to $NEW'; fi\" $@; fi;}; f "
qxo

9
git: 'change-commits' कोई git कमांड नहीं है। गिट - हेल्प ’देखें। इसका मतलब है कि आपने अपने git config में उपनाम नहीं जोड़ा है। जैसे git config -e
वेन

2
यह सिर्फ उन ईमेल के साथ सभी कमिट के डुप्लिकेट्स थे जिन्हें मैं बदलना चाहता था। इतिहास को फिर से लिखने के लिए प्रकट नहीं होता है। @ ऑलिवर वेरिडियर के समाधान ने मेरे लिए काम किया।
जेक विल्सन

6
अलग-अलग इनपुट्स के साथ दो बार पंक्ति में करने से यह होता है:Cannot create a new backup. A previous backup already exists in refs/original/
theonlygusti

97

समाधान पहले से ही है: लेखक और कमिट नाम और Git में कई कमिट्स का ई-मेल बदलें

अर्थात्,

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

4
क्या यह शाखा के सभी कमिट (पूरे इतिहास) के लिए लेखक का नाम नहीं बदलेगा?
hasen

2
हाँ, यह सब नए लेखक जानकारी के लिए बदल जाएगा।
ewall

9
कृपया उत्तर को कॉपी करने के बजाय डुप्लिकेट के रूप में प्रश्नों को चिह्नित करें।
गिवेंसे g

2
क्या होगा यदि मैंने एक पुराना नाम या पुराना ईमेल निर्दिष्ट नहीं किया है? git का कहना है कि "खाली पहचान <> अनुमति नहीं है"
ग्रिफ़न

मैंने इस कमांड को चलाया और अब मेरा रेपो git सर्वर से पुश या पुल नहीं करेगा।
यीशु एच

46

यदि आपने पहले से ही अपने कुछ कमिट्स को पब्लिक रिपॉजिटरी में धकेल दिया है, तो आप ऐसा नहीं करना चाहते हैं, या यह मास्टर के इतिहास का एक वैकल्पिक संस्करण बना देगा जिसका दूसरों ने इस्तेमाल किया होगा। "धाराओं को पार न करें ... यह बुरा होगा ..."

उस ने कहा, यदि यह केवल आपके स्थानीय रिपॉजिटरी के लिए किए गए कमिट्स हैं, तो सर्वर पर पुश करने से पहले सभी तरीकों से इसे ठीक कर लें। आप विकल्प के git filter-branchसाथ कमांड का उपयोग कर सकते हैं --commit-filter, इसलिए यह केवल एडिट करता है जो आपकी गलत जानकारी से मेल खाता है, जैसे:

git filter-branch --commit-filter '
      if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
      then
              GIT_AUTHOR_NAME="Your Name Here (In Lights)";
              GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
              git commit-tree "$@";
      else
              git commit-tree "$@";
      fi' HEAD

5
यह सही काम करता है जबकि हरे रंग में चिह्नित उत्तर नहीं था
jmary

बाद में, कोई बैकअप को खाली करना चाह सकता है git update-ref -d refs/original/refs/heads/master, देखें < stackoverflow.com/a/7654880/333403 >।
cknoll

FYI करें: यदि आपके पास कई गलत नाम / ईमेल हैं, तो आपको इसे कई बार चलाने की आवश्यकता हो सकती है। यदि ऐसा होता है तो यह इस त्रुटि के साथ आप पर विलाप करेगा: A previous backup already exists in refs/original/उस स्थिति में, इसे फिर से चलाएं, नए ईमेल के साथ, और -f--commit-filter से पहले जोड़ें । अपने विवेक से उपयोग करें। आमतौर पर -fयह क्या हो रहा है की जानकारी के बिना करना एक खतरनाक बात है।
चक

19

ओलिवियर वेर्डियर के जवाब को लागू करने के बाद:

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

... मूल भंडार पर बदले हुए इतिहास को आगे बढ़ाने के लिए:

git push origin +yourbranch

उपरोक्त कमांड (नोट प्लस) मूल रेपो पर इतिहास को फिर से लिखने के लिए मजबूर करता है। सावधानी से प्रयोग करें!


मेरे लिए काम किया, मूल रूप से इतिहास को भी सही ढंग से लिखा।
Xeverous

10
यह सभी कमिटों को फिर से लिखने जा रहा है - चाहे जो भी इसे लेखक लिखा हो। सावधानी से प्रयोग करें।
भाविन दोशी

14

https://help.github.com/articles/changing-author-info/

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"

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

यह पूरी तरह से मेरे लिए काम किया। Git पुश के बाद, git के वेब पोर्टल पर अपडेट देखना सुनिश्चित करें। यदि कमिट मेरे खाते से जुड़ी नहीं थी, तो कमिट के बगल में डिफॉल्ट थंबनेल इमेज दिखाई गई और यह मेरे योगदान टाइमलाइन चार्ट पर प्रतिबिंबित नहीं हुई, कमिट url पर जाएं और url के अंत में .patch और नाम सत्यापित करें। और ईमेल सही हैं।


जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
झपट्ट

1
यह सभी शाखाओं का पुनर्लेखन मात्र है।
ब्रूनो ज़ेल

6

उन लोगों के लिए जो केवल आसान कॉपी पेस्ट संस्करण चाहते हैं (ईमेल और नामों को अपडेट करने से अलग):

git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "
git change-commits GIT_AUTHOR_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_AUTHOR_EMAIL <old@email.com> <new@email.com> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <old@email.com> <new@email.com> -f

5
-बश:! f: घटना नहीं मिली
सैय्यिन

सबसे अधिक संभावना एक चीज के साथ एक समस्या है जो स्वचालित रूप से बच रही है
आंद्रेई साविन

3

के उपयोग को ध्यान में रखते git-filter-branchहै वांछित नहीं , में एक ही बात करने के लिए Git फिल्टर-रेपो (आप के साथ पहली बार यह स्थापित करने के लिए आवश्यकता हो सकती है pip install git-filter-repo):

git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'

यदि रिपॉजिटरी मूल है, w / o रिमोट, तो आपको --forceफिर से लिखने के लिए बाध्य करना होगा । (ऐसा करने से पहले आप अपने रेपो का बैकअप बनाना चाह सकते हैं।)

यदि आप refs को संरक्षित नहीं करना चाहते हैं (वे Git GUI के शाखा इतिहास में प्रदर्शित किए जाएंगे), तो आपको जोड़ना होगा --replace-refs delete-no-add

अधिक उन्नत सुविधाओं के लिए, "नामों और ईमेल को फ़िल्टर करना" देखें ।

PS चोरी और https://stackoverflow.com/a/59591928/714907 से सुधार हुआ ।

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