গিটে একাধিক কমিটির লেখক এবং প্রতিশ্রুতিবদ্ধ নাম এবং ইমেল কীভাবে পরিবর্তন করবেন?


2390

আমি স্কুল কম্পিউটারে একটি সাধারণ স্ক্রিপ্ট লিখছিলাম, এবং গিতে পরিবর্তনগুলি সংঘটিত করছিলাম (একটি রেপো যা আমার পেনড্রাইভে ছিল, আমার কম্পিউটার থেকে ঘরে বসে ক্লোন করা হয়েছিল)। বেশ কয়েকটি কমিট করার পরে আমি বুঝতে পারি যে আমি রুট ব্যবহারকারী হিসাবে স্টাফ করছিলাম।

এই কমিটগুলির লেখক আমার নামে পরিবর্তন করার কোনও উপায় আছে কি?


13
প্রশ্ন: গিট ফিল্টার-শাখা ব্যবহার করে কি পূর্ববর্তী ট্যাগগুলি, সংস্করণগুলি এবং অবজেক্টগুলির জন্য SHA1 গুলি সংরক্ষণ করে? অথবা লেখকের নাম বল পরিবর্তন করা কি যুক্ত এসএএএ 1 এরও পরিবর্তন করবে?
অ্যান্ডি

36
হ্যাশগুলি হ্যাঁ বদলে যাবে
পাওয়া যাবে না

3
স্পর্শকাতরভাবে, আমি একটি ছোট স্ক্রিপ্ট তৈরি করেছি যা শেষ পর্যন্ত আমার জন্য মূল কারণটি স্থির করে। gist.github.com/tripleee/16767aa4137706fd896c
ট্রিপলি

2
@ আইপিনবোল প্রশ্নের বয়স খুব কমই প্রাসঙ্গিক। একটি নতুন সদৃশ প্রশ্ন তৈরি করা প্রশ্নটির বাইরে। আমি মনে করি আমি এমন একটি প্রশ্ন তৈরি করতে পারলাম যা এই নির্দিষ্ট উত্তরটির দিকে চেয়ে থাকে তবে আমি পুরোপুরি বিশ্বাস করি না যে এটি এতটা দৃশ্যমানতা পাবে। এখানে গিট প্রশ্নের সংকট রয়েছে বলে মনে হচ্ছে না ... খুশী আমি যাইহোক, সহায়তা করতে পারি।
ট্রিপলি

উত্তর:


1209

এই উত্তরটি ব্যবহার করে git-filter-branch, যার জন্য ডক্স এখন এই সতর্কতা দেয়:

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

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

বিশেষত, আপনি এই কমান্ডের সাহায্যে সমস্ত শাখা এবং ট্যাগের জন্য সমস্ত ভুল লেখকের নাম এবং ইমেলগুলি ঠিক করতে পারেন (উত্স: গিটহাব সহায়তা ):

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
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

610
গিথুবের সেই সহায়তার জন্য একটি পাবলিক স্ক্রিপ্ট আছে. github.com/articles/changing-author-info এবং এটি দুর্দান্ত কাজ করে!
Defvol

34
স্ক্রিপ্টটি কার্যকর করার পরে আপনি "গিট আপডেট-রেফ-ডি-রেফ / মূল / রেফ / হেড / মাস্টার" চালিয়ে ব্যাকআপ শাখাটি সরিয়ে ফেলতে পারেন।
DR

7
@ আরডওই, এটি আমার সমস্ত প্রতিলিপিগুলি সদৃশ করে।
রাফায়েল ব্যারোস

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

20
ব্যবহার করে সমাধান হয়েছেgit push --force --tags origin HEAD:master
এমকন্ট

1577

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

ইন্টারেক্টিভ রিবেস ব্যবহার করা

আপনি করতে পারেন

git rebase -i -p <some HEAD before all of your bad commits>

তারপরে আপনার সমস্ত খারাপ কমিটগুলি রিবেস ফাইলটিতে "সম্পাদনা" হিসাবে চিহ্নিত করুন। যদি আপনিও নিজের প্রথম প্রতিশ্রুতি পরিবর্তন করতে চান, আপনাকে ম্যানুয়ালি এটি রিবেস ফাইলের প্রথম লাইন হিসাবে যুক্ত করতে হবে (অন্যান্য লাইনের বিন্যাসটি অনুসরণ করুন)। তারপরে, যখন গিট আপনাকে প্রতিটি প্রতিশ্রুতি সংশোধন করতে বলে, তখন করুন

 git commit --amend --author "New Author Name <email@address.com>" 

সম্পাদনা করুন বা খোলার সম্পাদকটি বন্ধ করুন এবং তারপরে করুন

git rebase --continue

রিবেস চালিয়ে যেতে।

--no-edit কমান্ডটি যাতে করে সংযোজন করে আপনি এখানে পুরোপুরি সম্পাদক খোলার এড়াতে পারেন:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

একক প্রতিশ্রুতি

কিছু মন্তব্যকারী উল্লেখ করেছেন যে, আপনি যদি সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি পরিবর্তন করতে চান তবে রিবেস আদেশটি প্রয়োজনীয় নয়। শুধু কর

 git commit --amend --author "New Author Name <email@address.com>"

এটি লেখককে নির্দিষ্ট করা নামটিতে পরিবর্তন করবে তবে প্রতিশ্রুতিবদ্ধটি আপনার কনফিগার করা ব্যবহারকারীর সাথে সেট করা হবে git config user.nameএবং তে git config user.email। আপনি যদি কিছু নির্দিষ্ট করে প্রতিশ্রুতিবদ্ধ সেট করতে চান তবে এটি লেখক এবং প্রতিশ্রুতিবদ্ধ উভয়কে সেট করবে:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

মার্জ কমিটগুলিতে নোট

আমার মূল প্রতিক্রিয়াতে কিছুটা ত্রুটি ছিল। যদি বর্তমান HEADএবং আপনার মধ্যে কোনও মার্জ কমিট থাকে <some HEAD before all your bad commits>তবে git rebaseসেগুলি সমতল করে তুলবে (এবং যাইহোক, আপনি যদি গিটহাব পুলের অনুরোধগুলি ব্যবহার করেন তবে আপনার ইতিহাসে এক টন মার্জ কমিট থাকবে)। এটি প্রায়শই খুব আলাদা ইতিহাসের দিকে ডেকে আনতে পারে (যেমন সদৃশ পরিবর্তনগুলি "পুনরায় সাজানো" হতে পারে) এবং সবচেয়ে খারাপ ক্ষেত্রে, এটি git rebaseআপনাকে একত্রীকরণের কঠিন সংঘাতগুলি সমাধান করার জন্য জিজ্ঞাসা করতে পারে (যা সম্ভবত মার্জ কমিটগুলিতে ইতিমধ্যে সমাধান হয়েছিল)। সমাধানটি হ'ল -pপতাকাটি এতে ব্যবহার করা git rebaseহবে যা আপনার ইতিহাসের মার্জ কাঠামোটি সংরক্ষণ করবে। এর জন্য ম্যানপেজটি git rebaseহুঁশিয়ারি দিয়েছে যে ব্যবহার করা -pএবং -iসমস্যার দিকে নিয়ে যেতে পারে তবে এটির মধ্যেBUGS বিভাগটিতে বলা হয়েছে "সম্পাদনা করে এবং তাদের প্রতিশ্রুতি বার্তাগুলি পুনরায় রেকর্ডিংয়ের কাজ করা উচিত" "

আমি -pউপরের কমান্ড যুক্ত করেছি । যে ক্ষেত্রে আপনি সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি পরিবর্তন করছেন, এটি কোনও সমস্যা নয়।


27
অদ্ভুত প্রতিশ্রুতি
রক্ষার

32
টিপিক্যাল ওয়ান-ভুল ফিক্সের জন্য ইউজকেস উল্লেখ করার জন্য +1: গিট কমিট --amend --author = ব্যবহারকারীর নাম
নাথান কিড

12
এটি নিখুঁত, আমার সর্বাধিক সাধারণ ব্যবহার হ'ল আমি অন্য কম্পিউটারে বসে লেখক স্থাপন করতে ভুলে যাই এবং এইভাবে সাধারণত <5 টি কমিট বা ঠিক করতে হয়।
জিতরেক্স

57
git commit --amend --reset-authorএছাড়াও একবার কাজ করে user.nameএবং user.emailসঠিকভাবে কনফিগার করা হয়।
pts

14
পরে করে লেখক তথ্য লেখা <commit>ব্যবহার user.nameএবং user.emailথেকে ~/.gitconfig: রান git rebase -i <commit> --exec 'git commit --amend --reset-author --no-edit', সংরক্ষণ, ত্যাগ করুন। সম্পাদনা করার দরকার নেই!
এনটিসি 2

588

আপনি এটি করতে পারেন:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

দ্রষ্টব্য, আপনি যদি উইন্ডোজ কমান্ড প্রম্পটে এই কমান্ডটি ব্যবহার করে থাকেন তবে তার "পরিবর্তে আপনাকে ব্যবহার করতে হবে ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

4
Env- ফিল্টার ব্যবহার সহজ সমাধান না? তবে কেন এটি আরও বেশি ভোট পাচ্ছে তা নিশ্চিত নয়।
stigkj

3
তারপরে লিঙ্কটি নষ্ট হয়ে যায়। আমরা কীভাবে এই পরিবর্তনগুলিকে অন্য ভাণ্ডারে ঠেলে দেব?
রাসেল

28
env- ফিল্টার সমস্ত কমিট পরিবর্তন করবে। এই সমাধানটি শর্তসাপেক্ষে অনুমতি দেয়।
ব্যবহারকারী 208769

5
"A previous backup already exists in refs/original/ Force overwriting the backup with -f"দুঃখিত তবে এই -fফ্ল্যাশটি যখন দু'বার সম্পাদন করা হচ্ছে তখন -ফ্ল্যাগটি কোথায় চলেছে। প্রকৃতপক্ষে এটি ব্রায়ানের উত্তরে রয়েছে, ফিল্টার-শাখার ঠিক পরে ঝামেলার জন্য দুঃখিত the
এইচ এইচ

2
@ user208769 এনভি-ফিল্টার শর্তসাপেক্ষে অনুমতি দেয়; আমার উত্তরটি দেখুন :-)
stigkj

558

একটি লাইনার, তবে আপনার যদি একাধিক ব্যবহারকারীর সংগ্রহস্থল থাকে তবে সাবধান হন - এটি একই (নতুন) লেখক এবং প্রতিশ্রুতিবদ্ধতার জন্য সমস্ত প্রতিশ্রুতি পরিবর্তন করবে ।

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

স্ট্রিংয়ের লাইনব্রেক সহ (যা ব্যাশে সম্ভব)

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

মাইনর পয়েন্ট, রফতানি আসলে অতিরিক্ত অতিরিক্ত তবে এটি কোনও ক্ষতি করে না। যেমন গিট-ফিল্টার-শাখা --env-ফিল্টার "GIT_AUTHOR_NAME = 'নতুন নাম'; GIT_AUTHOR_EMAIL = 'নতুন ইমেল'" হেড।
অ্যালেক দ্য গীক

4
আপনি যদি আদেশটির HEADশেষে উল্লেখ করে থাকেন তবে এটি কেন সমস্ত কমিট পুনর্লিখন করে ?
নিক ভলিনকিন

1
এটি আমার বিটবাকেট সংগ্রহস্থলের জন্য কাজ করে না, কোনও ধারণা? আমি git push --force --tags origin 'refs/heads/*'পরামর্শ দেওয়া কমান্ডের পরে একটি করি
ওরোরিন

1
এর জন্য পুশ কমান্ডটি হ'ল:$git push --force --tags origin 'refs/heads/master'
নীলেশ পাঠক

1
ঝরঝরে; এটি পুরানো টাইমস্ট্যাম্পগুলিকেও রাখে।
ধর্মতুর্তল

221

যখন আপনার কোনও OME HOM / .gitconfig আরম্ভ হয় না তখনই এটি ঘটে। আপনি এটিকে ঠিক করতে পারেন:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

গিট সংস্করণ 1.7.5.4 এর সাথে পরীক্ষিত


9
এটি শেষ প্রতিশ্রুতিতে সত্যিই ভাল কাজ করে। সুন্দর এবং সহজ। না আছে ব্যবহার একটি বৈশ্বিক পরিবর্তন হতে --localখুব কাজ
বেন

এই এক আমার জন্য বড় বিজয়ী ছিল! git commit --amend --reset-author --no-editকমান্ড যদি আপনি ভুল লেখক তথ্য সমেত করে তৈরী করেছিলেন এবং তারপর সঠিক লেখক ঘটনা-পরবর্তী মাধ্যমে নির্ধারণ করে বিশেষভাবে কার্যকর git config। যখন আমার ইমেলটি আপডেট করতে হয়েছিল ঠিক তখনই আমার একটি ved সংরক্ষণ করেছে।
ecbrodie

186

একটি একক প্রতিশ্রুতি জন্য:

git commit --amend --author="Author Name <email@address.com>"

(asmeurer এর উত্তর থেকে নেওয়া)


14
তবে এটি কেবলমাত্র যদি এটি
রিচার্ড

4
মতে git help commit, git commit --amend"বর্তমান শাখার ডগায়" (যা প্রধান) কমান্ডটি পরিবর্তন করে। এটি সাধারণত সবচেয়ে সাম্প্রতিক প্রতিশ্রুতি, তবে আপনি যে প্রতিশ্রুতিবদ্ধ তা বা এটি আগে পরীক্ষা করে এটি আপনার যে কোনও প্রতিশ্রুতিবদ্ধ করতে পারেন । git checkout <branch-name>git checkout <commit-SHA>
ররি ও'কেনে

12
তবে আপনি যদি এটি করেন তবে ইতিমধ্যে পিতামাতার মতো প্রতিশ্রুতিবদ্ধ সমস্ত কমিটই ভুল অঙ্গীকারের দিকে ইঙ্গিত করবে। সেই সময়ে ফিল্টার-শাখা ব্যবহার করা ভাল।
জন গিয়েজেন

3
@ জনগিয়েটজেন: আপনি যে চুক্তিটি পরিবর্তন করেছেন তার বদলে যেটি পরিবর্তন করেছেন তা ফিরিয়ে দিতে পারেন। তবে, আপনি যদি> 1 কমিট করছেন, তবে উল্লিখিত হিসাবে, ফিল্টার-শাখা সম্ভবত অনেক সহজ হতে চলেছে।
থানাটোস

5
দ্রষ্টব্য যে এই পরিবর্তনগুলি কেবল প্রতিশ্রুতিবদ্ধ authorএবং নয়committer
নিক ভলিনকিন

179

সেক্ষেত্রে শীর্ষস্থানীয় কয়েকটি কমিটের খারাপ লেখক রয়েছে এমন ক্ষেত্রে, আপনি কমান্ড এবং প্রতিশ্রুতিবদ্ধতা git rebase -iব্যবহার করে execএটির নীচে সমস্ত কিছু করতে পারেন --amend:

git rebase -i HEAD~6 # as required

যা আপনাকে সম্পাদনের যোগ্য সম্পাদনের তালিকার সাথে উপস্থাপন করে:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

তারপরে exec ... --author="..."খারাপ লেখকদের সাথে সমস্ত লাইনের পরে লাইন যুক্ত করুন :

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

সংরক্ষণ এবং প্রস্থান সম্পাদক (চালানোর জন্য)।

এই সমাধানটি অন্য কারও চেয়ে টাইপ করতে দীর্ঘতর হতে পারে তবে এটি অত্যন্ত নিয়ন্ত্রণযোগ্য - আমি জানি যে এটি কী আঘাত করে তা হ'ল।

অনুপ্রেরণার জন্য @ এসম্যুরারকে ধন্যবাদ


26
অবশ্যই দুর্দান্ত। আপনি কি রেপোর স্থানীয় কনফিগারেশনে user.name এবং user.email সেট করে এটি সংক্ষিপ্ত করতে পারেন, এবং তারপরে প্রতিটি লাইন কেবলমাত্র exec git commit --amend --reset-author -C HEAD?
অ্যান্ড্রু

1
ক্যানোনিকাল উত্তর, ফিল্টার-শাখা ব্যবহার করার জন্য, আমার জন্য কেবল মুছে ফেলা রেফ / হেড / মাস্টার। সুতরাং আপনার নিয়ন্ত্রণযোগ্য, সম্পাদনযোগ্য সমাধানে +1 করুন। ধন্যবাদ!
jmtd

এর Someone else's commitপরিবর্তে আপনি কেন শুরু করবেন my bad commit 1? আমি কেবল HEAD^^সর্বশেষ 2 টির কমিটগুলি সংশোধন করার চেষ্টা করেছি এবং এটি পুরোপুরি সূক্ষ্মভাবে কাজ করেছিল।
ফ্রেডওভারফ্লো 12'14

3
আপনার জায়গায় git rebase -i HEAD^^^^^^git rebase -i HEAD~6
লিখতেও

1
দয়া করে মনে রাখবেন এটি কমিটের টাইমস্ট্যাম্প পরিবর্তন করে। দেখুন stackoverflow.com/a/11179245/1353267 সঠিক টাইমস্ট্যাম্প প্রত্যাবর্তন করলে জন্য
Samveen

111

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

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

5
নিখুঁতভাবে কাজ করেছেন। git reset --hard HEAD^অন্যান্য স্থানীয় সংগ্রহস্থলগুলিতে তাদের পূর্ববর্তী সংস্করণে পেতে, git pullসংশোধিত সংস্করণটি তৈরি করতে কেবল কয়েকবার সময় লেগেছে, এবং এখানে আমি কোনও লাইন ছাড়াই আছি unknown <stupid-windows-user@.StupidWindowsDomain.local>(গিটের ডিফল্টটি পছন্দ করেছি)।
অ্যালান বরই

1
আমি এর পরে ধাক্কা দিতে পারি না। আমার কি "-f" ব্যবহার করতে হবে?
ফিশ মনিটর

9
আমি করেছি git push -f। এছাড়াও, এর পরে স্থানীয় রেপগুলিকে পুনরায় সংবিধান করতে হবে।
ফিশ মনিটর

যদি আপনাকে একটি নির্দিষ্ট শাখায় শেল স্ক্রিপ্টটি চালানোর দরকার হয় তবে আপনি শেষ লাইনটি ": মাস্টার..আপনার শাখা-নাম" (আপনাকে মাস্টার ব্রাঞ্চ ধরে ধরে) পরিবর্তন করতে পারেন।
রবার্ট কাজিক

স্ক্রিপ্টটি আপডেট করা হয়েছে বলে লিঙ্কটি <দুর্দান্ত সমাধান> এ ক্লিক করুন
gxpr

82

যেমনটি ডকনোম উল্লেখ করা হয়েছে, পুনর্লিখনের ইতিহাসটি বিপজ্জনক এবং অন্যান্য ব্যক্তির ভাণ্ডারগুলি ভেঙে দেবে।

তবে আপনি যদি সত্যিই এটি করতে চান এবং আপনি বাশ পরিবেশে রয়েছেন (উইন্ডোজে লিনাক্সে কোনও সমস্যা নেই, আপনি গিট ব্যাশ ব্যবহার করতে পারেন, এটি গিট ইনস্টল করার সাথে উপলব্ধ) use গিট ফিল্টার-শাখা :

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL'

জিনিসগুলিকে গতি বাড়ানোর জন্য, আপনি পুনর্লিখন করতে চান এমন একটি সংশোধনী আপনি নির্দিষ্ট করতে পারেন:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD

2
মনে রাখবেন যে এটি কোনও পুরানো কমিটগুলিকে নির্দেশ করে কোনও ট্যাগ ছাড়বে। --tag-name-filter cat"এটি কাজ করুন" বিকল্পটি।
রোমান স্টারকভ

ট্যাগগুলি কীভাবে পরিবর্তন করতে হবে?
নিক ভলিনকিন

@ নিকভলিনকিন হ্যাঁ, আপনি উল্লেখ করেছেন --tag-name-filter cat। এটি সত্যিই ডিফল্ট আচরণ হওয়া উচিত ছিল।
রোমান স্টারকভ

48

অন্য লেখকের কাছ থেকে নিমজ্জিত প্রতিশ্রুতি গ্রহণ করার সময়, এটি হ্যান্ডেল করার একটি সহজ উপায় আছে।

git commit --amend --reset-author


1
একক প্রতিশ্রুতিবদ্ধতার জন্য, এবং আপনি যদি নিজের ব্যবহারকারী নামটি রাখতে চান তবে এটি সবচেয়ে সহজ উপায়।
পেড্রো

7
আপনি --no-editএটিকে আরও সহজ করে তুলতে যোগ করতে পারেন, কারণ বেশিরভাগ লোকেরা কেবল ইমেল ঠিকানাটিই আপডেট করতে চান, প্রতিশ্রুতি বার্তাটি নয়
প্লেগহ্যামার

আপনি কি দয়া করে সর্বশেষ কমিটের ইমেল / ব্যবহারকারীর
আদি

আপনি কি এই চেষ্টা করেছেন? এটি এর একটি পার্শ্ব প্রতিক্রিয়া হওয়া উচিত, যদি না স্ট্যাকওভারফ্লো.com/ a/ 2717477/654245 ভাল পথের মতো দেখায়।
রায়ানম্ট

46

আপনি এটি একটি উপাধ হিসাবে ব্যবহার করতে পারেন যাতে আপনি এটি করতে পারেন:

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

~ / .Gitconfig এ যুক্ত করুন:

[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 "

সূত্র: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

আশা করি এটি কার্যকর হবে।


"গিট: 'চেঞ্জ-কমিটস' গিট কমান্ড নয় See দেখুন 'গিট - হেল্প'।
নেটিভ_মোবাইল_আর্চ_দেব

এই আদেশটি ও মাস্টারটির সাথে সিঙ্কের পরে ইতিহাসের সমস্ত কমিটগুলি নকল হয়ে গেছে! এমনকি অন্যান্য ব্যবহারকারীদের মধ্যেও :(
ভ্লাদিমির

@ ভ্লাদিমির যা প্রত্যাশিত, দয়া করে
গিটে

39

এটি @ ব্রায়ানের সংস্করণের আরও বিস্তৃত সংস্করণ:

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

git filter-branch --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

আপনি এই ত্রুটিগুলির মধ্যে একটি পেতে পারেন:

  1. অস্থায়ী ডিরেক্টরি ইতিমধ্যে বিদ্যমান
  2. রেফগুলি / মূল দিয়ে শুরু হওয়া রেফগুলি ইতিমধ্যে বিদ্যমান
    (এর অর্থ অন্য একটি ফিল্টার-শাখা পূর্বে সংগ্রহস্থলে চালিত হয়েছিল এবং তত্ক্ষণাত মূল শাখার রেফারেন্সটি রেফ / মূলে ব্যাক আপ করা হয়েছে )

আপনি যদি এই ত্রুটি থাকা সত্ত্বেও রানটিকে জোর করতে চান তবে --forceপতাকাটি যুক্ত করুন:

git filter-branch --force --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

-- --allবিকল্পটির সামান্য ব্যাখ্যার প্রয়োজন হতে পারে: এটি সমস্ত রেফের (যাতে সমস্ত শাখা অন্তর্ভুক্ত) সমস্ত সংশোধনগুলিতে ফিল্টার-শাখা কাজ করে । এর অর্থ হ'ল উদাহরণস্বরূপ, ট্যাগগুলি আবারও লিখিত হয় এবং পুনর্লিখিত শাখাগুলিতে দৃশ্যমান।

পরিবর্তে একটি সাধারণ "ভুল" ব্যবহার করা HEADহয়, যার অর্থ কেবলমাত্র বর্তমান শাখায় সমস্ত সংশোধনগুলি ফিল্টার করা । এবং তারপরে পুনর্লিখিত শাখায় কোনও ট্যাগ (বা অন্যান্য রেফ) থাকবে না।


সমস্ত রেফারেন্স / শাখায় পরিবর্তন করে এমন একটি প্রক্রিয়া সরবরাহের জন্য কুদোস।
জনি উটাঃ

25

শেষ এন এর জন্য লেখককে পরিবর্তন করার জন্য একটি একক কমান্ড :

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

মন্তব্য

  • --no-editপতাকা নিশ্চিত The তোলেgit commit --amend একটি অতিরিক্ত নিশ্চিতকরণ জিজ্ঞাসা করা হয় না
  • আপনি যখন ব্যবহার করবেন git rebase -i, আপনি লেখকটি কোথায় পরিবর্তন করবেন তা ম্যানুয়ালি নির্বাচন করতে পারেন,

আপনার সম্পাদনা করা ফাইলটি দেখতে এইরকম হবে:

pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

তারপরে আপনি লেখকটি কোথায় পরিবর্তন করতে চান তা দেখতে আপনি কিছু লাইন সংশোধন করতে পারেন। এটি আপনাকে অটোমেশন এবং নিয়ন্ত্রণের মধ্যে একটি দুর্দান্ত মধ্যম স্থান দেয়: আপনি যে ধাপগুলি চলবে তা দেখেন এবং একবারে সমস্ত কিছু সংরক্ষণ করার পরে একবারে প্রয়োগ করা হবে।


অসাধারণ! ধন্যবাদ!
পাবলো ললনি

আমি হেড ~ 8 ব্যবহার করেছি এবং এটি গত 8 টির কমিটের চেয়ে বেশি দেখায়।
ব্রায়ান ব্রাইস

1
@ ব্রায়ানব্রাইস যদি মার্জ কমিট জড়িত থাকে তবে বিষয়গুলি জটিল হয়ে যায় :)
ক্রিস মেস

@ ক্রিসমাস আহ, দেখছি কী চলছে। আমি তাদের সাথে গণ্ডগোল করতে চাই না, কেবল যে শাখায় আমি চালু আছি।
ব্রায়ান ব্রাইস

সেক্ষেত্রে, আপনি যদি মাস্টারের কাছ থেকে শাখা নিয়ে এসেছিলেন, তবে আপনি করতে পারেন:git rebase -i master -x ...
ক্রিস মেস

23
  1. চালান git rebase -i <sha1 or ref of starting point>
  2. আপনি যে সমস্ত প্রতিশ্রুতি পরিবর্তন করতে চান তা চিহ্নিত করুন edit(বা e)
  3. আপনি সমস্ত কমিটগুলি প্রক্রিয়া না করা পর্যন্ত নিম্নলিখিত দুটি কমান্ড লুপ করুন:

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

এটি অন্যান্য প্রতিশ্রুতিবদ্ধ তথ্যের (তারিখগুলি সহ) রাখবে। --reuse-message=HEADবিকল্প লঞ্চ থেকে বার্তা সম্পাদক বাধা দেয়।


23

আমি ট্যাগ এবং সমস্ত শাখা সহ একটি সম্পূর্ণ সংগ্রহশালার জন্য লেখককে আবার লিখতে নিম্নলিখিতটি ব্যবহার করি:

git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='New name';
  export GIT_AUTHOR_EMAIL='New email'
" -- --all

তারপরে, ফিল্টার-শাখার এমএএন পৃষ্ঠায় বর্ণিত হিসাবে , ব্যাক আপযুক্ত সমস্ত মূল রেফগুলি সরিয়ে ফেলুন filter-branch(এটি ধ্বংসাত্মক, প্রথমে ব্যাকআপ):

git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d

2
এটি ব্যবহার করা খুব গুরুত্বপূর্ণ --tag-name-filter cat। অন্যথায় আপনার ট্যাগগুলি কমিটের মূল চেইনে থাকবে। অন্যান্য উত্তরগুলি এটি উল্লেখ করতে ব্যর্থ।
jeberle

21

আমি এই সমাধানটি খাপ খাইয়ে নিয়েছি যা একটি সাধারণকে খাওয়ার মাধ্যমে কাজ করে author-conv-file(ফর্ম্যাটটি গিট-সিভিসিম্পোর্টের মতো একই )। এটি সমস্ত ব্যবহারকারীকে হিসাবে সংজ্ঞায়িত করে পরিবর্তন করে কাজ করেauthor-conv-file সমস্ত শাখা জুড়ে ।

আমরা cvs2gitআমাদের সংগ্রহস্থলগুলি সিভিএস থেকে গিটে স্থানান্তর করতে এর সাথে একত্রে ব্যবহার করেছি ।

যেমন নমুনা author-conv-file

john=John Doe <john.doe@hotmail.com>
jill=Jill Doe <jill.doe@hotmail.com>

এই পান্ডুলিপি:

 #!/bin/bash

 export $authors_file=author-conv-file

 git filter-branch -f --env-filter '

 get_name () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=\(.*\) <.*>$/\1/"
 }

 get_email () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=.* <\(.*\)>$/\1/"
 }

 GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
     GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
     GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
     export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
     export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
 ' -- --all

ধন্যবাদ, আমি ভাবছি কেন এটি মূল গিট (বা গিট-এসএনএন) কার্যকারিতা নয়। এটি গিট এসএনএন ক্লোন এর পতাকা হিসাবে করা যেতে পারে তবে গিট ফিল্টার-শাখায় নয় ...
ড্যানিয়েল হার্শকোভিচ

20

আমার উল্লেখ করা উচিত যে যদি কেবল সমস্যাটি হয় তবে লেখক / ইমেলটি আপনার স্বাভাবিক থেকে আলাদা হয়, এটি কোনও সমস্যা নয়। সঠিক ফিক্সটি হ'ল .mailmapলাইকের মতো ডিরেক্টরিগুলির নীচে ডাকা একটি ফাইল তৈরি করা

Name you want <email you want> Name you don't want <email you don't want>

এবং তারপরে, এর মতো কমান্ডগুলি git shortlogসেই দুটি নাম একই হিসাবে বিবেচনা করবে (যদি আপনি তাদের নির্দিষ্ট করে না বলে থাকেন)। Http://schacon.github.com/git/git-shortlog.html দেখুনআরও তথ্যের জন্য ।

এখানে অন্যান্য সমস্ত সমাধানের সুবিধা রয়েছে যাতে আপনার ইতিহাস পুনর্লিখন করতে হবে না, যা আপনার প্রবাহে সমস্যা তৈরি করতে পারে এবং ঘটনাক্রমে ডেটা হারাতে সর্বদা একটি ভাল উপায়।

অবশ্যই, যদি আপনি নিজের মতো করে কিছু প্রতিশ্রুতিবদ্ধ হন এবং এটি সত্যিই অন্য কারও হওয়া উচিত, এবং এই মুহুর্তে আপনি ইতিহাস পুনর্লিখন করতে আপত্তি করেন না, প্রতিশ্রুতিবদ্ধ লেখক পরিবর্তন সম্ভবত বোধকরি উদ্দেশ্যগুলির জন্য একটি ভাল ধারণা (এই ক্ষেত্রে আমি আপনাকে আমার দিকে নির্দেশ করি) অন্যান্য উত্তর এখানে)।


18

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

নীচের সংস্করণটি সমস্ত শাখায় কাজ করে এবং এটি রোধ করতে লেখক এবং কমিটিকে আলাদাভাবে পরিবর্তন করে।

সমস্ত বিকল্পের জন্য leif81 থেকে কুদোস।

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<youmail@somehost.ext>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<youmail@somehost.ext>";
fi
' -- --all

18
  1. author name & emailদ্বারা প্রতিশ্রুতিবদ্ধতা পরিবর্তন করুন Amend, তারপরে প্রতিস্থাপন করুন old-commit with new-one:

    $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <author@email.com>" # change the author name and email
    
    $ git replace <old-commit-hash> <new-commit-hash>      # replace the old commit by new one
    $ git filter-branch -- --all                           # rewrite all futures commits based on the replacement                   
    
    $ git replace -d <old-commit-hash>     # remove the replacement for cleanliness 
    $ git push -f origin HEAD              # force push 
    
  2. অন্য উপায় Rebasing:

    $ git rebase -i <good-commit-hash>      # back to last good commit
    
    # Editor would open, replace 'pick' with 'edit' before the commit want to change author
    
    $ git commit --amend --author="author name <author@email.com>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
    

2
খুব সুন্দর উত্তর। আমি পছন্দ করি যে গিট কমিটগুলি পরিষ্কার করার এমনকি পরিবর্তনগুলি খুব আপডেট থেকে মুড়িয়ে ফেলা হয়েছে
আলেকস

12

এটির দ্রুততম, সহজতম উপায় হ'ল গিট রিবেসের সর্বনিম্ন যুক্তি ব্যবহার করা:

git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'

এটি এমন একটি টোড-তালিকা তৈরি করবে যা দেখতে এই রকম:

pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...

এবং এটি সমস্ত স্বয়ংক্রিয়ভাবে কাজ করবে, যা আপনার শত শত কমিট করার সময় কাজ করে।


9

আপনি যদি এই সংগ্রহস্থলের একমাত্র ব্যবহারকারী হন তবে আপনি (যেমন সাইক লিখেছেন ), বা / প্লাস ফিল্টার স্ক্রিপ্ট ( ডকনগম উত্তরে নিবন্ধে বর্ণিত ) বা ইন্টারেক্টিভ রিবেস ব্যবহার করে ইতিহাস পুনরায় লিখতে পারেন । তবে এর মধ্যে যে কোনও একটি প্রথমে পরিবর্তিত প্রতিশ্রুতি থেকে সংশোধনী পরিবর্তন করবে; এর অর্থ আপনার শাখার প্রাক-পুনর্লিখনের উপর ভিত্তি করে যে কেউ তার পরিবর্তনের উপর নির্ভর করে troublegit filter-branchgit fast-exportgit fast-import

পুনরুদ্ধার

যদি অন্য বিকাশকারীরা প্রাক-পুনর্লিখন সংস্করণে তাদের কাজকে ভিত্তি না করে তবে সহজ সমাধানটি পুনরায় ক্লোন করা (আবার ক্লোন) করা হবে।

বিকল্পভাবে তারা চেষ্টা করতে পারেন git rebase --pull, যদি তাদের ভাণ্ডারে কোনও পরিবর্তন না ঘটে, বা তাদের লিখিত শাখাগুলি পুনর্-লিখিত কমিটগুলির উপরে পুনরায় চালু করে (তবে আমরা মার্জটিকে এড়াতে চাই, কারণ এটি পুনরায় লেখার পূর্ববর্তী কমিটগুলি চিরকাল ধরে রাখবে) fast এগুলি সমস্তই ধরে নিচ্ছে যে তারা কোনও কাজ করে না; git stashঅন্যথায় পরিবর্তন দূরে রাখতে ব্যবহার করুন ।

যদি অন্য বিকাশকারীরা বৈশিষ্ট্য শাখা ব্যবহার করে, এবং / অথবা git pull --rebaseকাজ না করে যেমন আপস্ট্রিম সেট আপ করা হয়নি, তবে তাদের পুনর্লিখনের পোস্টের কমিটের উপরে তাদের কাজটি পুনরায় চালু করতে হবে। উদাহরণস্বরূপ, নতুন পরিবর্তনগুলি আনার পরে ( git fetch), masterভিত্তি করে / কাঁটাচামচ করা একটি শাখার জন্য origin/master, চালানো দরকার

$ git rebase --onto origin/master origin/master@{1} master

এখানে origin/master@{1}প্রাক-পুনর্লিখনের অবস্থা (আনার আগে), gitrevisions দেখুন


বিকল্প সমাধানটি হ'ল সংস্করণ ১. since.৫ থেকে গিটে উপলব্ধ রেফ / প্রতিস্থাপন / প্রক্রিয়া ব্যবহার করা হবে । এই সমাধানে আপনি যে কমিটের ভুল ইমেল রয়েছে তাদের প্রতিস্থাপন সরবরাহ করেন; তারপরে যে কেউ 'প্রতিস্থাপন' fetch = +refs/replace/*:refs/replace/*রেফগুলি নিয়ে আসে ( তাদের যথাযথ জায়গায় রেফস্পেকের মতো কিছু .git/config ) প্রতিস্থাপনটি স্বচ্ছভাবে পাবে এবং যারা এই না তারা পুরানো প্রতিশ্রুতি দেখতে পাবেন।

পদ্ধতিটি এরকম কিছু হয়:

  1. উদাহরণস্বরূপ ব্যবহার করে ভুল ইমেল সহ সমস্ত কমিট সন্ধান করুন

    $ git log --author=user@wrong.email --all
    
  2. প্রতিটি ভুল কমিটের জন্য, প্রতিস্থাপনের প্রতিশ্রুতি তৈরি করুন এবং এটি ডেটাবেস অবজেক্টে যুক্ত করুন

    $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt
    $ git hash-object -t commit -w tmp.txt
    <ID of corrected commit>
    
  3. এখন আপনি অবজেক্ট ডাটাবেসে কমিট সংশোধন করেছেন, আপনাকে git replaceকমান্ডটি ব্যবহার করে সংশোধন করে ভুল প্রতিশ্রুতিটি স্বয়ংক্রিয়ভাবে এবং স্বচ্ছভাবে প্রতিস্থাপন করতে গিটকে বলতে হবে :

    $ git replace <ID of wrong commit> <ID of corrected commit>
    
  4. অবশেষে, এই প্রক্রিয়াটি সফল হয়েছে কিনা তা পরীক্ষা করতে সমস্ত প্রতিস্থাপনের তালিকা তৈরি করুন

    $ git replace -l
    

    এবং প্রতিস্থাপনগুলি হয় কিনা তা পরীক্ষা করে দেখুন

    $ git log --author=user@wrong.email --all
    

আপনি অবশ্যই এই প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে করতে পারেন ... ভাল, git replaceযা ব্যাচ মোডে নেই তার ব্যবহার বাদে সমস্ত , সুতরাং আপনাকে তার জন্য শেল লুপ ব্যবহার করতে হবে, বা "হাত দ্বারা" প্রতিস্থাপন করতে হবে।

পরীক্ষিত না! YMMV।

মনে রাখবেন যে refs/replace/মেকানিজম ব্যবহার করার সময় আপনি কিছু রুক্ষ কোণে মুখোমুখি হতে পারেন : এটি নতুন এবং এখনও খুব ভাল পরীক্ষিত হয়নি


6

আপনি যে কমিটগুলি ঠিক করতে চান তা যদি সর্বশেষতম হয় এবং এর মধ্যে দু'টি হয় তবে আপনি git resetএবং এর সংমিশ্রণটি ব্যবহার করতে পারেনgit stash সঠিক নাম এবং ইমেল কনফিগার করার পরে আবার একটি অঙ্গীকারটি তাদের প্রতিশ্রুতি ফিরে পেতে পারেন।

ক্রমটি এরকম কিছু হবে (2 টি ভুল কাজের জন্য, কোনও মুলতুবি পরিবর্তন নেই):

git config user.name <good name>
git config user.email <good email>
git reset HEAD^
git stash
git reset HEAD^
git commit -a
git stash pop
git commit -a

5

আপনি যদি EGit এর সাথে Eclipse ব্যবহার করছেন তবে একটি সহজ সমাধান রয়েছে।
অনুমান: আপনার একটি স্থানীয় শাখায় 'লোকাল_মাস্টার_উজার_এক্স' তে কমিট রয়েছে যা অবৈধ ব্যবহারকারীর কারণে রিমোট শাখায় 'মাস্টার' এ ঠেলা যায় না।

  1. দূরবর্তী শাখা 'মাস্টার' চেকআউট করুন
  2. এমন প্রকল্প / ফোল্ডার / ফাইল নির্বাচন করুন যার জন্য 'লোকাল_মাস্টার_উজার_এক্স' পরিবর্তন রয়েছে
  3. ডান ক্লিক করুন - এর সাথে প্রতিস্থাপন করুন - 'স্থানীয়_মাস্টার_উজার_এক্স'
  4. এই পরিবর্তনগুলি আবারও সঠিক ব্যবহারকারী হিসাবে এবং স্থানীয় শাখায় 'মাস্টার' হিসাবে প্রতিশ্রুতিবদ্ধ করুন
  5. দূরবর্তী 'মাস্টার' এ ধাক্কা

5

ইন্টারেক্টিভ রিবেস ব্যবহার করে, আপনি যে প্রতিশ্রুতি পরিবর্তন করতে চান তার পরে আপনি একটি সংশোধনী কমান্ড রাখতে পারেন। এই ক্ষেত্রে:

pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead

3
এটির সাথে সমস্যাটি হ'ল অন্যান্য কমিট মেটাডেটা (যেমন তারিখ এবং সময় )ও সংশোধিত হয়। আমি সবেমাত্র এটি খুঁজে পেয়েছি ;-)
অর্ধ

5

দ্রষ্টব্য যে গিট দুটি পৃথক ই-মেইল ঠিকানা সঞ্চয় করে, একটি অঙ্গীকারকারীর জন্য (যে ব্যক্তি পরিবর্তনটি করেছিলেন) এবং অন্যটি লেখকের (পরিবর্তিত ব্যক্তি লিখেছেন) for

প্রতিশ্রুতিবদ্ধ তথ্য বেশিরভাগ জায়গায় প্রদর্শিত হয় না, তবে আপনি এটি git log -1 --format=%cn,%ce(বা কোনও নির্দিষ্ট প্রতিশ্রুতি নির্দিষ্ট করার showপরিবর্তে ব্যবহার করুন) দিয়ে দেখতে পারেন log

আপনার সর্বশেষ কমিটের লেখককে পরিবর্তন করা যেমন সহজ git commit --amend --author "Author Name <email@example.com>", তবুও কমিটরের তথ্যের সাথে একই কাজ করার কোনও ওয়ান-লাইনার বা যুক্তি নেই।

সমাধানটি হ'ল (অস্থায়ীভাবে, বা না) আপনার ব্যবহারকারীর তথ্য পরিবর্তন করুন, তারপরে প্রতিশ্রুতি সংশোধন করুন, যা প্রতিশ্রুতিবদ্ধটিকে আপনার বর্তমান তথ্যে আপডেট করবে:

git config user.email my_other_email@example.com 
git commit --amend

মনে রাখবেন যে পুরানো মানটি এখনও কয়েকটি জায়গায় রয়েছে path\to\repo\.git। এটি সম্পূর্ণরূপে বিতাড়িত করার জন্য আপনার কী করা দরকার তা আমি এখনও নিশ্চিত নই। দুর্ভাগ্যক্রমে সংশোধনগুলি (?) মুছে যাচ্ছে বলে মনে হচ্ছে না।
ruffin

5

আমরা আজ একটি সমস্যার মুখোমুখি হয়েছি যেখানে কোনও লেখকের নামের একটি ইউটিএফ 8 চরিত্র বিল্ড সার্ভারে সমস্যা সৃষ্টি করছিল, তাই এটি সংশোধন করার জন্য আমাদের আবার ইতিহাস লিখতে হয়েছিল। গৃহীত পদক্ষেপগুলি হ'ল:

পদক্ষেপ 1: এখানে দেওয়া নির্দেশাবলী অনুসারে ভবিষ্যতের সমস্ত কমিটগুলির জন্য গিটে আপনার ব্যবহারকারীর নাম পরিবর্তন করুন: https://help.github.com/articles/setting-your-username-in-git/

পদক্ষেপ 2: নিম্নলিখিত বাশ স্ক্রিপ্টটি চালান:

#!/bin/sh

REPO_URL=ssh://path/to/your.git
REPO_DIR=rewrite.tmp

# Clone the repository
git clone ${REPO_URL} ${REPO_DIR}

# Change to the cloned repository
cd ${REPO_DIR}

# Checkout all the remote branches as local tracking branches
git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout

# Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX
git filter-branch --env-filter '
OLD_EMAIL="me@something.com"
CORRECT_NAME="New Me"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
fi
' --tag-name-filter cat -- --branches --tags

# Force push the rewritten branches + tags to the remote
git push -f

# Remove all knowledge that we did something
rm -rf ${REPO_DIR}

# Tell your colleagues to `git pull --rebase` on all their local remote tracking branches

দ্রুত সংক্ষিপ্ত বিবরণ: আপনার সংগ্রহস্থলটি একটি অস্থায়ী ফাইলে চেকআউট করুন, সমস্ত দূরবর্তী শাখাগুলি চেকআউট করুন, স্ক্রিপ্টটি চালান যা ইতিহাস পুনর্লিখন করবে, নতুন রাষ্ট্রের জন্য একটি জোর চাপ দেবে, এবং আপনার সমস্ত সহকর্মীদের পরিবর্তনগুলি পেতে পুনরায় টানতে বলুন।

ওএস এক্স এ এটি চালাতে আমাদের সমস্যা হয়েছিল কারণ এটি কোনওভাবে প্রতিশ্রুতিবদ্ধ বার্তাগুলিতে লাইন শেষ করে ফেলেছিল, তাই আমাদের এটি পরে লিনাক্স মেশিনে আবার চালাতে হয়েছিল।


5

আপনার সমস্যাটি সত্যই সাধারণ। দেখুন " ফিক্স লেখক গীত মধ্যে তালিকাতে Mailmap ব্যবহার "

সরলতার স্বার্থে, প্রক্রিয়াটি সহজ করার জন্য আমি একটি স্ক্রিপ্ট তৈরি করেছি: গিট-চেঞ্জমেল

আপনার স্ক্রিপ্টটি স্ক্রিপ্টটি দেওয়ার পরে আপনি কমান্ডগুলি ইস্যু করতে পারেন:

  • বর্তমান শাখায় লেখকের মিলগুলি পরিবর্তন করুন

    $ git changemail -a old@email.com -n newname -m new@email.com
    
  • <ব্র্যাঞ্চ> এবং <ব্র্যাঞ্চ 2> এ লেখক এবং প্রতিশ্রুতিবদ্ধ ম্যাচগুলি পরিবর্তন করুন। -fপুনর্লিখনের ব্যাকআপগুলি অনুমোদনের জন্য ফিল্টার-শাখায় পাস করুন

    $ git changemail -b old@email.com -n newname -m new@email.com -- -f &lt;branch> &lt;branch2>
    
  • রেপোতে বিদ্যমান ব্যবহারকারীদের দেখান

    $ git changemail --show-both
    

যাইহোক, আপনার পরিবর্তনগুলি করার পরে, ফিল্টার-শাখা থেকে ব্যাকআপটি পরিষ্কার করুন: গিট-ব্যাকআপ-ক্লিন


1
আমি যখন আপনার কমান্ডটি চালিত করি, তখন এটি "মারাত্মক: 'গিট-চেঞ্জমেল' প্রয়োগ করতে পারে না: অনুমতি প্রত্যাখ্যান করা হয়েছে"
গোবিন্দ


3

আমি আমার উদাহরণটিও যুক্ত করতে চাই। আমি প্রদত্ত প্যারামিটার সহ একটি ব্যাশ_ফানশন তৈরি করতে চাই

এটি পুদিনা-লিনাক্স -17.3 এ কাজ করে

# $1 => email to change, $2 => new_name, $3 => new E-Mail

function git_change_user_config_for_commit {

 # defaults
 WRONG_EMAIL=${1:-"you_wrong_mail@hello.world"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"new_mail@hello.world"}

 git filter-branch -f --env-filter "
  if [ \$GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_COMMITTER_NAME='$NEW_NAME'
    export GIT_COMMITTER_EMAIL='$NEW_EMAIL'
  fi
  if [ \$GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_AUTHOR_NAME='$NEW_NAME'
    export GIT_AUTHOR_EMAIL='$NEW_EMAIL'
  fi
 " --tag-name-filter cat -- --branches --tags;
}

2

আপনি যদি এই রেপোর একমাত্র ব্যবহারকারী বা আপনি সম্ভবত অন্য ব্যবহারকারীদের জন্য রেপো ভাঙ্গার বিষয়ে চিন্তা করেন না, তবে হ্যাঁ। যদি আপনি এই প্রতিশ্রুতিগুলি ঠেলে থাকেন এবং সেগুলির উপস্থিতি অন্য কোথাও এগুলিতে অ্যাক্সেস করতে পারে তবে তা না, যদি না আপনি অন্য লোকের ভাঙ্গা ভাঙার চিন্তা করেন না। সমস্যাটি এই কমিটগুলি পরিবর্তন করে আপনি নতুন এসএইচএ তৈরি করবেন যা তাদেরকে বিভিন্ন কমিট হিসাবে বিবেচনা করবে। অন্য কেউ যখন এই পরিবর্তিত কমিটগুলি টেনে আনার চেষ্টা করেন, ইতিহাসটি আলাদা এবং কবুম is

এই পৃষ্ঠাটি http://inputediaation.blogspot.com/2008/08/how-to-change-git-commit-author.html এটি কীভাবে করবেন তা বর্ণনা করে। (আমি এটি এত চেষ্টা করেছিলাম না ওয়াইএমএমভি)


সুতরাং, ইউজার.ইমেল পুনরায় লেখার কোনও নিরাপদ উপায় নেই। সবাইকে উড়িয়ে না দিয়ে। আমি জানতাম যে পুনর্লিখনের ইতিহাসটি একটি খারাপ ধারণা, আমি কেবল ভেবেছিলাম নিরাপদে এটি করার কোনও পরিষ্কার উপায় থাকতে পারে। ধন্যবাদ।
manumoomoo

@ মিডিয়াস্লেভ: চেষ্টা করুন refs/replace/মেকানিজম।
জাকুব নারেবস্কি

meta.stackexchange.com/a/8259/184684 - ওরফে, তাদের উত্তরে তৈরি করতে যোগফলগুলি যোগ করুন।
ruffin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.