কোনও ভুল ইমেল ঠিকানা / নাম সংশোধন করতে আমি গিটের ইতিহাস কীভাবে সম্পাদনা করব [বন্ধ]


76

আমি যখন গিট ব্যবহার করা শুরু করলাম তখন আমি কেবল একটি করেছি git initএবং কল করা শুরু করেছি addএবং commit। এখন আমি মনোনিবেশ করা শুরু করছি এবং আমি দেখতে পাচ্ছি যে আমার কমিটগুলি cowens@localmachineআমি চাই ঠিক ঠিকানাটির পরিবর্তে প্রদর্শিত হচ্ছে। এটি প্রদর্শিত হচ্ছে যেন আমি যা করতে চাই তা করব GIT_AUTHOR_EMAILএবং GIT_COMMITTER_EMAILকরব, তবে আমার এখনও সেই পুরানো প্রতিশ্রুতিগুলি ভুল ইমেল ঠিকানা / নাম নিয়ে রয়েছে। আমি কীভাবে পুরানো কমিটগুলি সংশোধন করতে পারি?


4
আমাদের ভবিষ্যতের পাঠকদের জন্য: স্ট্যাক ওভারফ্লোতেgit এর অনুরূপ উদ্দেশ্যে ব্যবহার সম্পর্কিত প্রশ্নগুলি আরও ভাল জিজ্ঞাসা করা হয় ।
মাইকেল হ্যাম্পটন

এখানে স্ট্যাকওভারফ্লো ডটকমের নিকটতম প্রশ্ন
nnot101

উত্তর:


82

আপনি ফিরে যেতে পারেন এবং গিট ফিল্টার-শাখায় একক কল দিয়ে আপনার সমস্ত কমিটগুলি ঠিক করতে পারেন। এটি রিবেসের মতো একই প্রভাব ফেলেছে, তবে প্রতিটি প্রতিশ্রুতি পৃথকভাবে স্থির করার পরিবর্তে আপনার কেবলমাত্র সমস্ত ইতিহাস ঠিক করার জন্য আপনাকে একটি আদেশ করতে হবে।

আপনি এই আদেশ দিয়ে সমস্ত ভুল ইমেল ঠিক করতে পারেন:

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

গিট ডক্স থেকে আরও তথ্য পাওয়া যায়


11
ভাল, গিট ফিল্টার-শাখা --env-ফিল্টার 'এক্সপোর্ট GIT_AUTHOR_EMAIL = "foo@example.com"; GIT_AUTHOR_NAME = "ফু" "অনেক সহজ, ধন্যবাদ। আমি যদি এটি পরিবর্তন করতে পারি তবে এটি গ্রহণযোগ্য উত্তর হবে (মনে হচ্ছে সার্ভার ফল্ট সহ কোনও ত্রুটি রয়েছে)।
চস ওয়েন্স

7
দ্রষ্টব্য যে রফতানির লাইনে সমান চিহ্নের উভয় পাশে ফাঁকা স্থান থাকা উচিত নয়। অর্থাৎ তাদের দেখতে এইরকম হওয়া উচিত: GIT_AUTHOR_EMAIL = "(সঠিক ইমেল)" রফতানি করুন;
অ্যান্ডি বালাম

1
এখন, আমি কীভাবে উইন্ডোজ এ করব?
কার্স্টেন স্মিটজ

2
@ ডেকার্ড: স্ক্রিপ্টটি কোনও টেক্সট ফাইলে যেমন ফিক্সকমিট.এসএসে সংরক্ষণ করুন, তারপরে গিট ব্যাশ চালান এবং স্ক্রিপ্টটি চালান। আমি স্ক্রিপ্ট ফাইলটি আমার রেপোর গোড়ায় রেখেছিলাম, তারপরে গিট ব্যাশের সেই ফোল্ডারে গিয়েছিলাম, তারপরে আমি ./fixcommits.sh- এর সাথে স্ক্রিপ্টটি চালিয়েছিলাম
অ্যাভালানচিস

2
সংযোজন 1 এই কমান্ড ফর্ম্যাটটি আমার পক্ষে কাজ করে না, তবে / যদি তা করে থাকে:if [ "$GIT_AUTHOR_EMAIL" = "$oldemail" ]; then GIT_AUTHOR_EMAIL="$newemail"; fi
জোশ এম।

28

গিটের ফিল্টার-শাখা কমান্ডটি শক্তিশালী, তবে অপ্রয়োজনীয় যে কোনও কিছুর জন্য ব্যবহার করা মারাত্মকভাবে অযৌক্তিক, উদাহরণস্বরূপ, যদি আপনার একাধিক লেখক সংশোধন করতে পারেন।

আমি এখানে একটি বিকল্প খুঁজে পেয়েছি যা দরকারী, যা গিট-শর্টলগ ম্যানপেজে বর্ণিত .mailmap বৈশিষ্ট্যটি ব্যবহার করে। এটি কোনও লেখকের ম্যাপিং প্রক্রিয়া সরবরাহ করে যা আমরা গিট লগের বিন্যাস সুবিধা সহ ব্যবহার করতে পারি। আমরা এটি ব্যবহারের একটি নামযুক্ত ক্রম সংশোধন ও সংশোধন করার জন্য আদেশগুলি উত্পন্ন করতে ব্যবহার করতে পারি।

উদাহরণস্বরূপ, ধরুন আপনি কোনও শাখা $ ব্রাঞ্চে লেখকত্ব সংশোধন করতে চান, প্রতিশ্রুতিবদ্ধ $ START থেকে শুরু করে।

আপনার সংগ্রহস্থলের শীর্ষ ডিরেক্টরিতে আপনাকে একটি মেইলম্যাপ ফাইল তৈরি করতে হবে যা বিদ্যমান লেখকের নামগুলি মানচিত্রের সাথে মানচিত্র করে। আপনি এটির সাথে বিদ্যমান লেখকের নামের একটি তালিকা পেতে পারেন:

git shortlog -se

আপনার (মেইল) এর মতো একটি মেইলম্যাপ ফাইলটি শেষ করতে হবে:

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

এখন আপনি it ব্রাঞ্চকে $ ব্রাঞ্চ 2 হিসাবে পুনরায় লেখার কমান্ড তৈরি করতে গিট লগের বিন্যাস বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

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

প্রথম কমান্ডটি কমিট $ START থেকে অঙ্কিত নতুন খালি শাখা তৈরি করে। Commit START থেকে তারপরে $ শাখার শেষের মধ্যে প্রতিটি কমিটের জন্য, দ্বিতীয় কমান্ড চেরি বর্তমান শাখা $ 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

এটা সত্যিই দারুন. আমার আরও রেসিপি থাকলে আমি আপনাকে অনুগ্রহ জানাতাম। ধন্যবাদ :)
পিস্তছে

9

উত্তরটির সংমিশ্রণটি আমি গিটে প্রথম প্রতিশ্রুতিবদ্ধকরণের কীভাবে সংশোধন করব?

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

আমাকে সঠিক পথে নিয়ে এসেছি, কিন্তু হুকুম থেকে প্রয়োজন: stackoverflow.com/a/28536828/307 --author ব্যবহারের পরিবর্তে
ব্রেট Veenstra

5

জেডবার্গের উত্তর অনুসরণ করতে: আপনি প্রশ্নে কমিটগুলি rebase -iসম্পাদনা করতে এবং ব্যবহার করতে পারেন । আপনি যদি ব্যবহার করেন git commit --amend --author <AUTHOR DETAILS>এবং তারপরে git rebase continueআপনি ইতিহাসটি ঠিক করতে পারেন।

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