আমি কি পূর্বের সমস্ত কমিটগুলিতে আমার নাম এবং উপাধি পরিবর্তন করতে পারি?


122

আমি আমার সমস্ত প্রতিবেদনে আমার নাম, নাম এবং ইমেল পরিবর্তন করতে চাই, এটা কি সম্ভব?


2
এটি কি কেবল আপনার জন্য, কিছু লোকের জন্য বা কোনও বড় প্রকল্পের জন্য একটি প্রতিস্থাপন?
thejh



উত্তর:


212

ব্যবহার git-filter-branch

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
  fi; git commit-tree "$@"'

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

মান সাবধানবাণী ইতিহাস প্রযোজ্য rewriting সম্পর্কে; কেবল ইতিহাসে এটি করুন যা এখনও ভাগ করা হয়নি।

জুন 2018 আপডেট

ম্যানুয়ালটিতে এখন এর সমাধানগুলি অন্তর্ভুক্ত রয়েছে --env-filterযার উদাহরণগুলিতে: https://git-scm.com/docs/git-filter- ব্রাঞ্চ#_ উদাহরণ :

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

4
আপনি যদি ব্যবহার করেন তবে msysgitআপনার এখনও অ্যাক্সেস থাকতে পারে bash। অন্যথায়, আমার কোনও ক্লু নেই।
জোশ লি

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

এবং ট্যাগ সম্পর্কে কি? এই সমাধান ট্যাগের লেখক পরিবর্তন করবে না
piotrek

@ জোশুয়া একটি লিনাক্স বাক্সে গিট রেপো পরীক্ষা করে দেখুন এবং সেখানে ফিক্সটি সম্পাদন করুন
শেপার্ড

এমন কোনও বিকল্প নেই যার ফলস্বরূপ নতুন শাখা এবং ছেড়ে যাওয়ার উত্স অক্ষত থাকে?
ইউজেন কনকভ 16

56

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

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

1
কিন্তু রিমোট সার্ভারে পরিবর্তনগুলি কীভাবে প্রয়োগ করবেন?
ভিকিড

5
@ ভিকি চেষ্টা করুনgit push --all origin --force
ব্যবহারকারী 11153

2
এটা আমার জন্য কাজ করে ! আমি গিটল্যাব ব্যবহার করছি, পুশ কমান্ডের আগে আমাকে শাখাটি অরক্ষিত করতে হবে।
ভিকয়েড

37

অন্য কোনও লেখক না থাকলে আপনি এটি করতে পারেন:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

1
এটি "প্রতিশ্রুতিবদ্ধ:" তথ্য পুনর্লিখন করছে না।
ব্যবহারকারী 11153

1
এটি প্রতিশ্রুতিবদ্ধ তথ্য পুনরায় লেখার উদ্দেশ্যে নয়। আপনি যদি এটি করতে চান, GIT_COMMITTER_NAME এবং GIT_COMMITTER_EMAIL পাশাপাশি রপ্তানি করুন (স্বীকৃত উত্তর দেখুন)।
ক্রোনস্পোন

12

নীচের স্ক্রিপ্টটি যেমন সংরক্ষণ করুন ~/.bin/git-replace-authorএবং এটি ব্যবহার করে চালান, উদাহরণস্বরূপ:

git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"

কোনও যুক্তি ছাড়াই এটি গিট কনফিগারেশন অনুসারে আপনার বর্তমান ইমেল ঠিকানাটি ব্যবহার করার জন্য আপনার নামের সাথে সমস্ত প্রতিশ্রুতি আপডেট করে।

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"

echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"

git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
    export GIT_AUTHOR_NAME="${NEW_NAME}"
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
    export GIT_COMMITTER_NAME="${NEW_NAME}"
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

কাঁচা (ডাউনলোড করতে)


একটি সংক্ষিপ্ত নোট হিসাবে: ~/.bin/ভিতরে ব্যবহারকারীদের করা প্রয়োজন $PATH, এবং ফাইল চাহিদা এক্সিকিউটেবল হতে হবে যাতে সঞ্চালন করুন: chmod +x ~/.bin/git-replace-author
মাইকেল গ্যাচট

এবং এটি যুক্তি দিয়ে কি?
ইউজেন কনকভ

2

আপনি যদি নিজের প্রতিশ্রুতি বিশ্বে না চালিত হন তবেই। অন্যান্য জ্ঞানী প্রত্যেকেরই রেপোতে আপনার পুরাতন নাম রয়েছে যা আপনি সবার নাম পরিবর্তন করতে পারবেন না।


সত্য, তবে কিছু ক্ষেত্রে আপনার কোনও বিকল্প নেই। আমি আমার ক্ষেত্রে আমার গিট কনফিগারেশনে কনফিগার করা একটি ভুল ইমেল ঠিকানা ছিল (যেমন আমি "গিট কনফিগারেশন - গ্লোবাল-এল" দিয়ে দেখতে পেলাম)। ফলস্বরূপ, আমার নিজের গিথুব রেপোতে আমার কোনও প্রতিশ্রুতিবদ্ধ ক্রিয়াকলাপ ছিল না (কারণ ইমাম ঠিকানাটি গিথুবটিতে কনফিগার করা ইমেলের সাথে মেলে না)! এটি সমাধান করার জন্য, আমি স্ট্যাকওভারফ্লো.com / a / 23564785 / 2474068 (নিখুঁত কাজ করেছেন) থেকে রেসিপিটি ব্যবহার করে আমার স্থানীয় প্রতিশ্রুতিগুলি স্থির করেছি এবং তারপরে আমি "গিট পুশ-ইউ-ফ অরিজিন মাস্টার" ব্যবহার করে গিথুবে পরিবর্তিত প্রতিশ্রুতিগুলি ঠেলেছি (বল দিয়ে) পতাকা "-f") এটি গ্রহণযোগ্য অনুশীলনের বিরুদ্ধে যায় তবে আমার কোনও বিকল্প ছিল না!
লিও

1
হ্যাঁ, আমার বক্তব্যটি ছিল যে রেপোর যে কোনও কাঁটাচামচ পরিবর্তিত হবে না যদি না তারা আপনার জোর ধাক্কা গ্রহণ করে। প্রতিটি কাঁটাচামচ আপডেট করা চ্যালেঞ্জিং হবে :)
এনাব্রেনটেন

1

গিট 2.24 (কিউ 4 2019) সহ, git filter-branchএবং (এবং বিএফজি) হ্রাস করা হয়েছে

সমতুল্য হ'ল, ব্যবহার newren/git-filter-repoএবং এর উদাহরণ বিভাগ :

cd repo
git filter-repo --mailmap my-mailmap

সাথে my-mailmap:

Correct Name <correct@email.com> <old@email.com>

এটি কারও দ্বারা করা কোনও প্রতিশ্রুতি লেখকের নাম এবং ইমেল প্রতিস্থাপন করবে <old@email.com>

এর সঠিক বাক্য গঠনের জন্য git shortlogম্যাপিং লেখকের বিভাগটি দেখুন

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