क्या मैं अपना नाम और उपनाम पिछले सभी कमिटों में बदल सकता हूं?


122

मैं अपने सभी कमिट में अपना नाम, उपनाम और ईमेल बदलना चाहूंगा, क्या यह संभव है?


2
क्या यह केवल आप के लिए, कुछ लोगों के लिए या किसी बड़ी परियोजना के लिए एक भंडार है?
thejh



जवाबों:


212

का उपयोग करें git-filter-branch

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
  fi; git commit-tree "$@"'

यह केवल लेखक को प्रभावित करता है, न कि कमिटेर (जो कि ज्यादातर कमिट्स लेखक के समान होगा)। यदि आप उन लोगों को भी फिर से लिखना चाहते हैं, तो GIT_COMMITTER_NAMEऔर GIT_COMMITTER_EMAILचर सेट करें ।

मानक चेतावनी इतिहास लागू होता है फिर से लिखने के बारे में; केवल उस इतिहास के लिए करें जिसे अभी तक साझा नहीं किया गया है।

जून 2018 अपडेट

मैनुअल में अब --env-filterइसका उदाहरण सहित , एक समाधान का उपयोग करना शामिल है : https://git-scm.com/docs/git-filter-branch#_examples :

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

4
यदि आप उपयोग कर रहे हैं msysgit, तो आपके पास अभी भी पहुंच है bash। अन्यथा, मुझे कोई सुराग नहीं है।
जोश ली

@ जोशुआ अगर आप किसी ऐसी चीज का उपयोग कर रहे हैं, जहां आपको बैश नहीं है, तो आप शायद विंडोज़ बैच स्क्रिप्टिंग का उपयोग कर सकते हैं, हालांकि मैंने कोशिश नहीं की है।
MatrixFrog

और टैग के बारे में क्या? यह समाधान लेखक के टैग को नहीं बदलेगा
piotrek

@ जोशुआ एक बॉक्स बॉक्स पर गिट रेपो की जांच करते हैं और वहां पर प्रदर्शन करते हैं
विल शेपर्ड

क्या कोई विकल्प है जिसके परिणामस्वरूप नई शाखा और अवकाश स्रोत बरकरार है?
यूजेन कोनकोव

56

सभी चयनित कमिट्स में लेखक और कमटर दोनों को फिर से लिखना:

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

1
लेकिन रिमोट सर्वर में परिवर्तन कैसे लागू करें?
vikyd

5
@ वीकी कोशिशgit push --all origin --force
user11153

2
इससे मेरा काम बनता है ! मैं GitLab का उपयोग कर रहा हूं, मुझे पुश कमांड से पहले शाखा को खोलना है।
विकेड

37

यदि कोई अन्य लेखक नहीं हैं, तो आप कर सकते हैं:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

1
यह "कमेटी:" जानकारी का पुनर्लेखन नहीं है।
user11153

1
यह कमिट जानकारी को फिर से लिखने का इरादा नहीं है। यदि आप ऐसा करना चाहते हैं, तो GIT_COMMITTER_NAME और GIT_COMMITTER_EMAIL को भी निर्यात करें (स्वीकृत उत्तर देखें)।
क्रोनोस्पून 17

12

नीचे दी गई स्क्रिप्ट को उदाहरण के रूप में सहेजें ~/.bin/git-replace-authorऔर इसका उपयोग करके चलाएं, जैसे:

git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"

बिना किसी तर्क के, यह आपके द्वारा अपने वर्तमान ईमेल पते को Git config के अनुसार उपयोग करने के लिए आपके नाम के साथ सभी अपडेट करता है।

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"

echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"

git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
    export GIT_AUTHOR_NAME="${NEW_NAME}"
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
    export GIT_COMMITTER_NAME="${NEW_NAME}"
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

कच्चा (डाउनलोड करने के लिए)


एक छोटे नोट के रूप में: ~/.bin/उपयोगकर्ताओं के अंदर होना चाहिए $PATHऔर फ़ाइल को निष्पादन योग्य बनाने की आवश्यकता है, इसलिए चलाएँ chmod +x ~/.bin/git-replace-author:।
माइकल जॉर्ज पंच

और यह तर्कों के साथ क्या करता है?
यूजेन कोनकोव

2

केवल तभी जब आपने अपने कमिट को दुनिया में नहीं धकेला है। अन्य बुद्धिमान हर किसी के अपने रेपो में आपका पुराना नाम होता है जो कि संभावना नहीं है कि आप हर किसी को बदल सकते हैं।


सच है, लेकिन कुछ मामलों में आपके पास कोई विकल्प नहीं है। मेरे मामले में मेरे पास मेरे git config में गलत ईमेल पता था (जैसा कि मैं "git config --global -l" के साथ देख सकता था)। नतीजतन, मेरे पास अपने गितुब रेपो में दिखाने के लिए कोई प्रतिबद्ध गतिविधि नहीं थी (क्योंकि ईमेल पता जीथूब में कॉन्फ़िगर किए गए ईमेल के साथ मेल नहीं खाता था)! इस समस्या के समाधान के लिए, मैं से नुस्खा का उपयोग कर अपने स्थानीय प्रतिबद्ध तय stackoverflow.com/a/23564785/2474068 (काम सही) और फिर मैं Github के लिए बदली हुई प्रतिबद्ध धक्का दे दिया "Git धक्का -u -f मूल मास्टर" का उपयोग कर (बल के साथ झंडा "-f")। यह स्वीकृत अभ्यास के खिलाफ जाता है लेकिन मेरे पास कोई विकल्प नहीं था!
leo

1
हां, मेरा कहना यह था कि उस रेपो के किसी भी कांटे में तब तक बदलाव नहीं होगा जब तक वे आपके बल को स्वीकार नहीं करते। यह अद्यतन करने के लिए हर कांटा पाने के लिए चुनौतीपूर्ण होगा :)
EnabrenTane

1

Git 2.24 (Q4 2019), git filter-branch(और BFG) के साथ पदावनत किया गया है

समतुल्य होगा, उपयोग करना newren/git-filter-repo, और इसका उदाहरण अनुभाग :

cd repo
git filter-repo --mailmap my-mailmap

साथ my-mailmap:

Correct Name <correct@email.com> <old@email.com>

यह लेखक के नाम और किसी के द्वारा किए गए किसी भी ईमेल का स्थान लेगा <old@email.com>

सटीक सिंटैक्स के लिए git shortlogमैपिंग लेखक अनुभाग देखें

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