git - কীভাবে লেখক এবং কমেটার নাম পরিবর্তন করবেন এবং জিটের একাধিক কমেন্টের ইমেইল করবেন?




15 Answers

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

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

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 কোনও --no-edit না করে যাতে কমান্ডটি --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.name কনফিগার git config user.name এবং git config user.email আপনার কনফিগার করা ব্যবহারকারীকে git config user.name সেট করা হবে। আপনি যদি নির্দিষ্ট কিছুতে কম্যুটার সেট করতে চান তবে এটি লেখক এবং সম্পাদক উভয়কে সেট করবে:

 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 তাদের ফ্ল্যাট করবে (এবং উপায় অনুসারে, যদি আপনি গিটহুব টান অনুরোধগুলি ব্যবহার করেন তবে একত্রিত হওয়ার জন্য একটি টন হবে আপনার ইতিহাসে commits)। এটি প্রায়শই খুব ভিন্ন ইতিহাসের দিকে পরিচালিত করতে পারে (যেহেতু সদৃশ পরিবর্তনগুলি "পুনঃপ্রতিষ্ঠিত" হতে পারে), এবং সবচেয়ে খারাপ ক্ষেত্রে, এটি জটিল বিবাদ বিরোধগুলির সমাধান করার জন্য আপনাকে জিজ্ঞাসা করার জন্য git rebase হতে পারে (যা ইতিমধ্যে মার্জ কমিটিতে সমাধান করা হয়েছে )। সমাধানটি হল -p ফ্ল্যাগটি git rebase , যা আপনার ইতিহাসের মার্জ গঠন সংরক্ষণ করবে। git rebase রিবেজের জন্য git rebase সতর্ক করে দেয় যে -p এবং -i ব্যবহার করে সমস্যাগুলি হতে পারে, কিন্তু BUGS বিভাগে এটি বলে যে "সম্পাদন করা এবং তাদের প্রতিশ্রুতি বার্তাগুলিকে পুনর্বিবেচনা করা ভাল কাজ করতে হবে।"

আমি উপরের কমান্ড যোগ করা হয়েছে। যে ক্ষেত্রে আপনি কেবলমাত্র সাম্প্রতিকতম কমিটি পরিবর্তন করছেন, এটি কোনও সমস্যা নয়।

git version-control git-filter-branch git-rewrite-history

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

আমার এই নামে এই লেখক লেখার কোন উপায় আছে কি?




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

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

স্ট্রিং মধ্যে linebreaks সঙ্গে (যা ব্যাশে সম্ভব):

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 commit --amend --author="Author Name <email@address.com>"

(Asmeurer এর উত্তর থেকে নিষ্কাশিত)




Github একটি চমৎকার সমাধান আছে , যা নিম্নলিখিত শেল স্ক্রিপ্ট:

#!/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"
'



অন্য লেখক থেকে একটি unmerged কমিট গ্রহণ যখন, এই পরিচালনা করার জন্য একটি সহজ উপায় আছে।

git commit --amend --reset-author




আপনি এই উপনাম ব্যবহার করতে পারেন যাতে আপনি করতে পারেন:

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

এটা দরকারী হয় আশা করি।




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

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

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

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



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

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

সব অপশন জন্য leif81 থেকে Kudos।

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



আমার ইঙ্গিত করা উচিত যে যদি একমাত্র সমস্যাটি লেখক / ইমেল আপনার স্বাভাবিক থেকে আলাদা তবে এটি একটি সমস্যা নয়। সঠিক .mailmap লাইনে লাইক দিয়ে ডিরেক্টরিটির বেসে .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 দেখুন।

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

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




যদি আপনি ঠিক করতে চান তবে সর্বশেষগুলি এবং তাদের মধ্যে কয়েকটি, আপনি ডান নাম এবং ইমেল কনফিগার করার পরে আবার একটি প্রতিশ্রুতিতে ফিরে যেতে 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



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

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



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

ধাপ 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

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

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




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

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




আমি খুব আমার উদাহরণ যোগ করতে চান। আমি প্রদত্ত পরামিতি সঙ্গে একটি bash_function তৈরি করতে চান

এটি mint-linux-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;
}



এই চেষ্টা করুন। এটি উপরে উল্লিখিত হিসাবে একই কাজ করবে, কিন্তু interactively।

bash <(curl -s  https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)

রেফারেন্স: https://github.com/majdarbash/git-author-change-script




Related