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


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


72
2018-05-26 20:56


উত্স


আমাদের ভবিষ্যত পাঠকদের জন্য: ব্যবহার সম্পর্কে প্রশ্ন git এই উদ্দেশ্যে উদ্দেশ্যে ভাল জিজ্ঞাসা করা হয় স্ট্যাক ওভারফ্লো। - Michael Hampton♦
এখানে নিকটতম প্রশ্ন উপর stackoverflow.com। - naught101


উত্তর:


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

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

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

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


80
2018-05-27 17:51



ভাল, গিট ফিল্টার-শাখা --env-ফিল্টার 'এক্সপোর্ট GIT_AUTHOR_EMAIL = "foo@example.com"; GIT_AUTHOR_NAME = "Foo" অনেক সহজ, ধন্যবাদ। যদি আমি এটি পরিবর্তন করতে পারি তবে এটি গ্রহণযোগ্য উত্তর হবে (এটি সার্ভার ফল্টের সাথে একটি বাগ আছে বলে মনে হচ্ছে)। - Chas. Owens
উল্লেখ্য, এক্সপোর্ট লাইনগুলির সমান চিহ্নের উভয় পাশে স্পেস থাকতে হবে না। অর্থাত তারা এইরকম হওয়া উচিত: রপ্তানি GIT_AUTHOR_EMAIL = "(সঠিক ইমেল)"; - Andy Balaam
এখন, উইন্ডোজ এ কিভাবে করব? - Carsten Schmitz
@ ডাইকার্ড: স্ক্রিপ্টটিকে ফিক্সকমিটস.এস.এ একটি টেক্সট ফাইলে সংরক্ষণ করুন, তারপর গিট বাশ চালান এবং স্ক্রিপ্ট চালান। আমি স্ক্রিপ্ট ফাইলটি আমার রেপোর মূল অংশে রাখি, তারপর গিট বাশের সেই ফোল্ডারে নেভিগেট করেছিলাম, তারপর আমি স্ক্রিপ্টটি ./fixcommits.sh দিয়ে দৌড়ালাম। - Avalanchis
সংযোজন 1 এই কমান্ড বিন্যাস আমার জন্য কাজ করে না, কিন্তু যদি / তারপর করেনি: if [ "$GIT_AUTHOR_EMAIL" = "$oldemail" ]; then GIT_AUTHOR_EMAIL="$newemail"; fi - Josh M.


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

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

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

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

git shortlog -se

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

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

$ BRANCH হিসাবে $ BRANCH পুনঃলিখন করার জন্য কমান্ডগুলি জেনারেট করতে আপনি এখন জিট লগের ফর্ম্যাটিং বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

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

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

27
2017-07-29 10:54



এটা সত্যিই দারুন. আমি আরো rep ছিল যদি আমি আপনাকে দান করব। ধন্যবাদ :) - pistache


থেকে উত্তর একত্রিত করা আমি কিভাবে জিট প্রথম কমিটিতে metainformation ঠিক করতে পারি?

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

8
2018-05-27 16:45



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


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


4
2018-05-26 22:02