গিট, পূর্ববর্তী প্রতিশ্রুতিবদ্ধ ব্যবহারকারীর নাম এবং ইমেলগুলি পুনরায় লিখুন


170

আমি গিথুবের একটি প্রকল্পে অনেকগুলি প্রতিশ্রুতিবদ্ধ প্রতিজ্ঞাবদ্ধ হয়েছি, তবে আমি বুঝতে পেরেছিলাম যে আমি বর্তমানে আমার প্রতিশ্রুতিবদ্ধকরণের জন্য কম্পিউটারে সঠিক ইমেল এবং প্রতিশ্রুতিবদ্ধ পুরো নামটি স্থাপন করি নি এবং তাই ব্যবহারকারীদের অবতার এবং ইমেল ঠিকানা সেখানে না.

আমি কীভাবে অতীতের সমস্ত প্রতিশ্রুতিবদ্ধ ইমেল এবং ব্যবহারকারীর নাম লিখতে পারি?



আমি আমার গিটহাব অ্যাকাউন্টে ইমেল ঠিকানা পরিবর্তন করার পরে এটি অভিজ্ঞতা পেয়েছি। গিট কমান্ড লাইন (এবং গিটহাব ডেস্কটপ নয়) ইন্টারফেসটি ব্যবহার করে স্থানীয় গিট রেপো থেকে কোড পরিবর্তনগুলি ধাকানোর পাশাপাশি আমি গিটহাব ওয়েব ইন্টারফেস ব্যবহার করে প্রত্যন্ত গিট রেপো থেকে সরাসরি পাঠ্য সম্পাদনা করেছি এবং ফাইলগুলি পরিচালনা করেছি। নতুন ইমেল ঠিকানাটি কেবল পূর্ববর্তী নয় বরং পরবর্তী পদক্ষেপের ফলে সম্পাদিত প্রতিশ্রুতিগুলিতে প্রচারিত হয়েছিল।
রবার্ট জন

উত্তর:


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"committer ইমেল পরিবর্তন করতে।
লরেন্ট

19
উবুন্টুতে " 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 "
ইওল

9
গিট: 'চেঞ্জ-কমিটস' গিট কমান্ড নয়। 'গিট - হেল্প' দেখুন। এর অর্থ আপনি আপনার গিট কনফিগারেশনে উপনাম যুক্ত করেন নি। যেমন গিট কনফিগারেশন
ওয়েন

2
আমি যে ইমেলটি পরিবর্তন করতে চাইছিলাম তা দিয়ে এটি সমস্ত কমিটের ডুপ্লিকেট তৈরি করেছে। ইতিহাস পুনরায় লেখার জন্য উপস্থিত হয় না। অলিভিয়ার ভারদিয়ারের সমাধান আমার পক্ষে কাজ করেছে।
জ্যাক উইলসন

6
বিভিন্ন ইনপুট দিয়ে Cannot create a new backup. A previous backup already exists in refs/original/
একটানা

97

ইতিমধ্যে সমাধানটি এখানে রয়েছে: গিটে একাধিক কমিটির লেখক এবং প্রতিশ্রুতিবদ্ধ নাম এবং ইমেল পরিবর্তন করুন

যেমন,

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
এটি কি শাখার সমস্ত কমিট (পুরো ইতিহাস) এর লেখকের নাম পরিবর্তন করবে না?
হেসেন

2
হ্যাঁ, এটি নতুন লেখকের তথ্যে সমস্ত প্রতিশ্রুতি পরিবর্তন করবে।
ewall

9
উত্তর কপি করার পরিবর্তে প্রশ্নগুলি সদৃশ হিসাবে চিহ্নিত করুন।
givanse

2
আমি যদি কোনও পুরানো নাম বা পুরানো ইমেলটি নির্দিষ্ট না করি তবে কী হবে? গিট বলে "খালি পরিচয় <> অনুমোদিত নয়"
গ্রিফান

আমি এই কমান্ডটি চালিয়েছি এবং এখন আমার রেপো গিট সার্ভারের দিকে টানবে না বা টানবে না।
যিশু এইচ

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< স্ট্যাকওভারফ্লো . com/a/7654880/333403 > দেখুন।
সি কেএনল

এফওয়াইআই: আপনার যদি একাধিক ভুল নাম / ইমেল থাকে তবে আপনার এটি একাধিকবার চালানোর প্রয়োজন হতে পারে। যদি এটি ঘটে থাকে তবে এই ত্রুটিটিটি আপনার সাথে শোক করবে: সেক্ষেত্রে A previous backup already exists in refs/original/নতুন ইমেল সহ এটিকে আবার চালান, এবং -f- কমিট-ফিল্টারের আগে একটি যুক্ত করুন । আপনার নিজস্ব বিবেচনার ভিত্তিতে ব্যবহার করুন। -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

এটি পুরোপুরি আমার পক্ষে কাজ করেছে। গিট পুশ করার পরে, গিটের ওয়েব পোর্টালে আপডেট দেখতে নিশ্চিত করুন। যদি প্রতিশ্রুতিটি এখনও আমার অ্যাকাউন্টের সাথে লিঙ্ক না করা থাকে, দায়বদ্ধতার পাশে ডিফল্ট থাম্বনেইল চিত্র দেখানো হয় এবং এটি আমার অবদানের টাইমলাইন চার্টে প্রতিফলিত হয় না, কমিট url এ যান এবং url এর শেষে প্যাচ করুন, এবং নামটি যাচাই করুন এবং ইমেল সঠিক।


যদিও এটি তাত্ত্বিকভাবে প্রশ্নের উত্তর দিতে পারে , এখানে উত্তরের প্রয়োজনীয় অংশগুলি অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্ক সরবরাহ করা ভাল।
jhpratt

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
-বাশ:! চ: ইভেন্টটি পাওয়া যায় নি
সাইয়াইন

সম্ভবত টার্মিনালটি স্বয়ংক্রিয়ভাবে জিনিসগুলি পালিয়ে যাওয়ার সমস্যা রয়েছে
আন্দ্রে স্যাভিন

3

ব্যবহারের বিবেচনা git-filter-branchকরা হয় কাম্য নয় , একই জিনিস করতে Git-Filter-রেপো (আপনার সাথে প্রথম এটি ইনস্টল করার প্রয়োজন হতে পারে 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")'

যদি সংগ্রহস্থলটি আসল হয়, ডাব্লু / ও রিমোট, আপনাকে যুক্ত করতে হবে --force পুনরায় লেখার জন্য জোর । (এটি করার আগে আপনি আপনার রেপোর ব্যাকআপ তৈরি করতে চাইতে পারেন))

আপনি যদি রেফগুলি সংরক্ষণ করতে না চান (সেগুলি Git GUI এর শাখার ইতিহাসে প্রদর্শিত হবে), আপনাকে যুক্ত করতে হবে --replace-refs delete-no-add

আরও উন্নত বৈশিষ্ট্যগুলির জন্য, "নাম ও ইমেলের ফিল্টারিং" দেখুন

পিএস চুরি এবং https://stackoverflow.com/a/59591928/714907 থেকে উন্নত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.