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


746

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



34
git commit --amend --reset-author
এরিক এম স্প্রেঞ্জেল

উত্তর:


535

git filter-branchএকটি এনভি ফিল্টার ব্যবহার করুন যা সেট করে GIT_AUTHOR_DATEএবং যে GIT_COMMITTER_DATEপ্রতিশ্রুতি সংশোধন করতে চাইছে তার নির্দিষ্ট হ্যাশটির জন্য।

এটি এটি এবং ভবিষ্যতের সমস্ত হ্যাশটিকে অবৈধ করে দেবে।

উদাহরণ:

আপনি যদি অঙ্গীকারের তারিখগুলি পরিবর্তন করতে চান 119f9ecf58069b265ab22f1f97d2b648faf932e0, আপনি এই জাতীয় কিছু দিয়ে এটি করতে পারেন:

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'


8
যে পাওয়া সঠিক মান, কিন্তু সেটিং যারা ভেরিয়েবল আসলে পুরাতন তারিখ প্রভাবিত কমিট মনে হয়নি।
আইকিউআন্দ্রিয়াস

36
"এটি সেই এবং ভবিষ্যতের সমস্ত হ্যাশটিকে অকার্যকর করবে" এর অর্থ কী?
এপিকডাভি

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

4
নতুনদের জন্য যেমন একটি নোট হিসাবে, সংক্ষিপ্ত হ্যাশটি যদি বিবৃতিতে কাজ করে না, দীর্ঘ
এসএএএ

779

আপনি একটি ইন্টারেক্টিভ রিবেস করতে পারেন এবং সেই প্রতিশ্রুতিটির সম্পাদনা চয়ন করতে পারেন যার তারিখটি আপনি পরিবর্তন করতে চান। যখন আপনি টাইপ করেছেন প্রতিশ্রুতি সংশোধন করার জন্য রিবেস প্রক্রিয়াটি থামবে:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"

এরপরে আপনি আপনার ইন্টারেক্টিভ রিবেস চালিয়ে যান।

আপডেট (স্টাডিজিকের মন্তব্যের জবাবে): লেখকের তারিখের পরিবর্তে কমিটের তারিখটি পরিবর্তন করতে:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend

উপরের লাইনগুলি পরিবেশগত পরিবর্তনশীল GIT_COMMITTER_DATE সেট করে যা সংশোধন প্রতিশ্রুতিতে ব্যবহৃত হয়।

গিট বাশে সমস্ত কিছু পরীক্ষা করা হয়।


22
@nschum --date = "" এবং --ডাটা "অ-তারিখ-পাঠ্য" সমস্তই এখনকার তারিখ গ্রহণ করে একই ফলন করে।
পল প্লেডিজ

12
গিট সংস্করণে 1.7.7.1
অ্যারাগর্ন

4
আপনি যে তারিখটি পরিবর্তন করতে চান তার প্রতিশ্রুতিটি যখন সাম্প্রতিকতম প্রতিশ্রুতিবদ্ধ হয়, তখন আপনাকে করতে হবে না rebase, আপনি কেবলমাত্র করতে পারেনgit commit --amend
এপোনামাস

7
GIT_COMMITTER_DATE = "" রফতানির পরিবর্তে, GIT_COMMITTER_DATE আনসেট করার চেষ্টা করুন।
মার্ক ই। হাজেস

2
আমি --no-edit ব্যবহার করছি যাতে আপনি স্বয়ংক্রিয় স্ক্রিপ্টগুলিতে ব্যবহার করতে পারেন! + var fixedDate = strftime(new Date(), "%c"); + var result = shelljs.exec("git commit --amend --date=\"" + fixedDate + "\" --no-edit");
মার্সেলো ডি বিক্রয়

392

একটি নির্দেশে এই সমস্ত পরামর্শগুলি হ্যান্ডেল করার একটি ভাল উপায়

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

এটি সর্বশেষ প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ এবং লেখকের তারিখটি "এখনই" সেট করবে।


22
একটি ইন্টারেক্টিভ রিবেসের সময় নির্দিষ্ট কমিটগুলি সম্পাদনা করতে এটি দুর্দান্ত কাজ করে।
friederbluemle

2
আপনিও এটির জন্য শেলটির একটি নাম রাখতে পারেন
ক্যালিসিন

14
দেখে মনে হচ্ছে গিট তারিখের ফর্ম্যাট সম্পর্কে স্থানীয়ভাবে সচেতন নয়, তাই পুরোপুরি সঠিক হতে LANG= GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`"
মাইকা গেরাল

আমি যখন একটি শাখাটি রিবায়েস এবং স্কোয়াশ করি তখন আমি তা করি, সুতরাং এটি আপডেট হওয়া টাইমস্ট্যাম্পের সাথে একটি একক প্রতিশ্রুতি তৈরি করে।
লুক এহ্রেসমান

12
আপনি ঠিক করতে পারেন --date "now"। গিট> = 2 এটি ব্যাখ্যা করবে।
উইসবুকি

189

শুধু কর git commit --amend --reset-author --no-edit। পুরানো প্রতিশ্রুতিগুলির জন্য, আপনি একটি ইন্টারেক্টিভ রিবেস করতে পারেন এবং editসেই প্রতিশ্রুতি চয়ন করতে পারেন যার তারিখটি আপনি সংশোধন করতে চান।

git rebase -i <ref>

তারপরে কমিটিকে সংশোধন করুন --reset-authorএবং --no-editলেখকের তারিখটি বর্তমান তারিখে পরিবর্তন করুন:

git commit --amend --reset-author --no-edit

অবশেষে আপনার ইন্টারেক্টিভ রিবেসটি চালিয়ে যান:

git rebase --continue

5
ব্যবহারের জন্য ভাল কল --reset-author, এটি গিট 1.6.6 এ নতুন (রেফারেন্স gitlog.wordpress.com/2010/01/13/git-1-6-6 )
টিম আবেল

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

4
নোটটি --reset-authorএখনই লেখক এবং লেখকের তারিখ উভয়কে পুনরায় সেট করবে।
উইসবুকি

এটি কি একই সাথে "কমিটির তারিখ" পরিবর্তন করবে?
luochen1990

134

আমি এর জন্য একটি স্ক্রিপ্ট এবং হোমব্রিউ প্যাকেজ লিখেছি। ইনস্টল করা খুব সহজ, আপনি এটি গিটহাব PotatoLabs/git-redateপৃষ্ঠায় খুঁজে পেতে পারেন ।

বাক্য গঠন:

git redate -c 3

আপনাকে কেবল দৌড়াতে হবে git redateএবং আপনি সর্বশেষতম 5 টি কমিটের ভিমে সমস্ত তারিখ সম্পাদনা করতে সক্ষম হবেন ( -cআপনি যে কতগুলি প্রতিশ্রুতি ফিরে যেতে চান তার বিকল্প রয়েছে, এটি কেবল 5 এ ডিফল্ট হবে)। আপনার যদি কোনও প্রশ্ন, মন্তব্য বা পরামর্শ থাকে তবে আমাকে জানান!

এখানে চিত্র বর্ণনা লিখুন


2
দুর্দান্ত জিনিস, যদিও আমাকে ন্যানোর চেয়ে
ভিএম

একটি দুর্দান্ত স্ক্রিপ্টের জন্য @ এডমন্ডকে ধন্যবাদ। আমি গিটার পুনঃনির্মাণ-সি চালানোর পরে vi তে সম্পাদনা করার তারিখটি দেখতে পেলাম না। আমি যা দেখছি তা% cI | XXXXXXXXXXXXXXXXX প্রাথমিক প্রতিশ্রুতি। আপনি দয়া করে সাহায্য করতে পারেন? ধন্যবাদ
Kiem গুয়েন

@ কিমনগুইন আপনি কি কেবল গিটকে পুনর্নির্মাণের চেষ্টা করতে পারেন (-সি ছাড়াই)?
বড়পোটাটো

4
এখানে মিনা এবং @ হাউডয়আউটুরান্টসিসনের সাথে সম্পূর্ণরূপে একমত, আপনি কেন এডিটোর পরিবেশ পরিবর্তনশীলের মাধ্যমে এটিকে সম্পাদক অজ্ঞেয় বানাবেন না? (এছাড়াও আমি লিনাক্সে আছি, ম্যাক নয় ...)
ympostor

3
ধন্যবাদ @ এডমন্ড! কেবলমাত্র ক্ষেত্রে, আপনার স্ক্রিপ্টের COMMITS- র জন্য ডিফল্ট মান হ্যান্ডেল করার ক্ষেত্রে একটি সমস্যা রয়েছে। যদি এটি সেট না করা থাকে, নিম্নলিখিত কোডটি কেবলমাত্র শেষ প্রতিশ্রুতিতে (আমার ধারণা / পাওয়া) ফিল্টার প্রয়োগ করে। "গিট ফিল্টার-শাখা -f --env-ফিল্টার" $ ENVFILTER "শিরোনাম MM MM কমিটস..হ্যাড> / দেব / নাল"
গ্রেগরি এন্টিন

101

প্রতিটি প্রতিশ্রুতি দুটি তারিখ, অঙ্গীকারের তারিখ এবং লেখকের তারিখের সাথে সম্পর্কিত। আপনি এই তারিখগুলি সাথে দেখতে পারেন:

git log --format=fuller

আপনি যদি লেখকের তারিখ এবং শেষ 6 টির কমিটের তারিখটি পরিবর্তন করতে চান তবে আপনি কেবল একটি ইন্টারেক্টিভ রিবেস ব্যবহার করতে পারেন:

git rebase -i HEAD~6

pick c95a4b7 Modification 1
pick 1bc0b44 Modification 2
pick de19ad3 Modification 3
pick c110e7e Modification 4
pick 342256c Modification 5
pick 5108205 Modification 6

# Rebase eadedca..5108205 onto eadedca (6 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

আপনি যে তারিখটি পরিবর্তন করতে চান সেখানে সমস্ত পরিবর্তনের জন্য, (বা কেবল ) pickদ্বারা প্রতিস্থাপন করুন , তারপরে আপনার সম্পাদকটি সংরক্ষণ করুন এবং প্রস্থান করুন।edite

আপনি এখন ISO-8601 ফর্ম্যাটে লেখকের তারিখ এবং প্রতিশ্রুতিবদ্ধতার তারিখ নির্দিষ্ট করে প্রতিটি প্রতিশ্রুতি সংশোধন করতে পারেন:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

প্রথম তারিখটি কমিটের তারিখ, দ্বিতীয়টি লেখকের তারিখ।

তারপরে পরবর্তী প্রতিশ্রুতিতে যান:

git rebase --continue

আপনার সমস্ত প্রতিশ্রুতি সংশোধন না করা পর্যন্ত প্রক্রিয়াটি পুনরাবৃত্তি করুন। আপনার অগ্রগতি পরীক্ষা করে দেখুন git status


1
আমি এটি অনুসরণ করে একটি 'বিচ্ছিন্ন মাথা' এ এসেছি!
সাইমন এইচ

1
@ সিমন এইচ আমি আমার উত্তরটি আবার পরীক্ষা করেছি এবং এটি ভালভাবে কাজ করে। আপনার আলাদা কিছু টাইপ করা উচিত ছিল বা আপনি ইতিমধ্যে একটি বিচ্ছিন্ন মাথাতে ছিলেন। বিচ্ছিন্ন মাথা থেকে ফিরে আসতে চাইলে ক git checkout name-of-current-branch
অরটোমালা লোকনি

3
এটি সেরা এবং সহজ উত্তর। ক্ষুদ্র ডগা: ব্যবহার --no-edit মধ্যে git commit --amend --no-edit --date=2017-10-08T09:51:07পুরাতন বার্তা কমিট রাখা।
মারিউজ পাভেলস্কি

2
আপনি GIT_COMMITTER_DATE এখানে eddmann.com/posts/…
স্মিহেল

2
@ সিমিহাইল লিঙ্কটির জন্য ধন্যবাদ। আমি আপনার পরামর্শ আমার উত্তর অন্তর্ভুক্ত করেছি।
অরটোমালা লোকনি


44

উপর নির্মাণের theosp এর উত্তর , আমি একটি স্ক্রিপ্ট নামক লিখেছেন git-cdc(পরিবর্তন তারিখের জন্য কমিট) যে আমি আমার রাখা PATH

নামটি গুরুত্বপূর্ণ: git-xxxআপনার যে কোনও জায়গায় PATHআপনাকে টাইপ করতে দেয়:

git xxx
# here
git cdc ... 

সেই স্ক্রিপ্টটি ব্যাশে রয়েছে, এমনকি উইন্ডোজেও (যেহেতু গিট এটির মিসেস পরিবেশ থেকে কল করবে )

#!/bin/bash
# commit
# date YYYY-mm-dd HH:MM:SS

commit="$1" datecal="$2"
temp_branch="temp-rebasing-branch"
current_branch="$(git rev-parse --abbrev-ref HEAD)"

date_timestamp=$(date -d "$datecal" +%s)
date_r=$(date -R -d "$datecal")

if [[ -z "$commit" ]]; then
    exit 0
fi

git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r"
git checkout "$current_branch"
git rebase  --autostash --committer-date-is-author-date "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"

এটির সাথে, আপনি টাইপ করতে পারেন:

git cdc @~ "2014-07-04 20:32:45"

এটি HEAD ( @~) এর আগে কমিটের লেখক / প্রতিশ্রুতির তারিখ নির্দিষ্ট তারিখে পুনরায় সেট করবে ।

git cdc @~ "2 days ago"

এটি শিরোনামের লেখকের / প্রতিশ্রুতির তারিখকে @~একই ঘন্টা থেকে পুনরায় সেট করতে হবে ( ) তবে ২ দিন আগে।


ইলিয়া সেমেনভ মন্তব্যগুলিতে উল্লেখ করেছেন :

ওএস এক্সের জন্য আপনি জিএনইউ coreutils( brew install coreutils) ইনস্টল করতে পারেন , এটিতে PATH( PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") যুক্ত করুন এবং তারপরে 2 days agoসিনট্যাক্স ব্যবহার করতে পারেন ।


1
আমার জন্য এটি কেবল তারিখ এবং সময়কে একটি উদ্ধৃতিতে উদ্ধৃত করে কাজ করেছে: git cdc @~ "2014-07-04 20:32:45অন্যথায় এটি সময়কে স্বীকৃতি দেয় না এবং তাই সময় অর্জন করতে পারে 00:00:00 (এটি তৃতীয় যুক্তি হয়ে যায়)।
peschü

3
ওএস এক্সের জন্য আপনি জিএনইউ কোর্টিলস ( brew install coreutils) ইনস্টল করতে পারেন , এটি PATH ( PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") এ যুক্ত করুন এবং তারপরে "2 দিন আগে" সিনট্যাক্স ব্যবহার করতে পারেন।
ইলিয়া সেমেনভ

1
@ ইলিয়াসেমেনভ আকর্ষণীয়। আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভোনসি

আমি আপনার প্রথম উদাহরণটি ব্যবহার করার চেষ্টা করছি তবে আমি "মারাত্মক: অবৈধ তারিখের ফর্ম্যাট:" পেয়ে চলেছি। ম্যাক ওএস এক্স কোন তারিখের ফর্ম্যাটটি প্রত্যাশা করছে?
ইউএসবিউক্র্যাশ

@ ইউএসউনক্র্যাশ ম্যাকের বিষয়ে নিশ্চিত নয়। দ্বিতীয় উদাহরণ " 2 days ago" কি কাজ করে?
ভনসি

25

একাধিক অঙ্গীকারের তারিখগুলি কীভাবে সম্পাদনা করবেন

বেশ কয়েকটি কমিটের তারিখ সম্পাদনা করার জন্য অন্যান্য উত্তরগুলি খুব সুবিধাজনক নয়। একটি কৌশল ভাগ করে নেওয়ার জন্য আমি কয়েক বছর পরে এই প্রশ্নে ফিরে এসেছি।

শেষ 4 টি কমিটের তারিখগুলি পরিবর্তন করতে:

git rebase -i HEAD~4

execপ্রয়োজন অনুসারে তারিখগুলি সংশোধন করতে লাইনগুলি সন্নিবেশ করিয়ে নীচে রিবেস সম্পাদনা করুন :

pick 4ca564e Do something
exec git commit --amend --no-edit --date "1 Oct 2019 12:00:00 PDT"
pick 1670583 Add another thing
exec git commit --amend --no-edit --date "2 Oct 2019 12:00:00 PDT"
pick b54021c Add some tests
exec git commit --amend --no-edit --date "3 Oct 2019 12:00:00 PDT"
pick e8f6653 Fix the broken thing
exec git commit --amend --no-edit --date "4 Oct 2019 12:00:00 PDT"

--amend/ --dateঅপশনটির দুর্দান্ত ব্যবহার । পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে আমার নিজের উত্তরের চেয়ে সহজ । সম্মত।
ভনসি

প্যারামিটার হিসাবে বর্তমান তারিখ / সময় ব্যবহার করা সম্ভব?

যে GIT_AUTHOR_DATEশুধুমাত্র আপডেট ।
ব্লেইস

করছেন। 'বর্তমানের তারিখ / সময়টিকে প্যারামিটার হিসাবে ব্যবহার করা কি সম্ভব?': "এখন" একটি বৈধ তারিখ হিসাবে বোঝা যায়, তাই উপরের এক্সিকিউটিভ লাইনগুলি হয়ে উঠবেexec git commit --amend --no-edit --date "now"
অ্যান্ড্রু রিচার্ডস

20

যদি এটি পূর্ববর্তী প্রতিশ্রুতিবদ্ধ হয়।

git rebase  -i HEAD~2
git commit --amend --date=now

যদি আপনি ইতিমধ্যে orgin এ চাপ দিন এবং জোর করে ব্যবহার করতে পারেন:

git push --force 

আপনি যদি জোর করে চাপ দিতে না পারেন এবং যদি এটি চাপ দেওয়া হয় তবে আপনি প্রতিশ্রুতি পরিবর্তন করতে পারবেন না! ।


18

এখানে একটি সুবিধাজনক উপনাম যা সর্বশেষ প্রতিশ্রুতিবদ্ধতার প্রতিশ্রুতিবদ্ধ ও লেখক উভয় সময়ের পরিবর্তিত সময়ের দ্বারা পরিবর্তিত হয়েছে date --date:

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && GIT_COMMITTER_DATE=\"$d\" \
            git commit --amend --date \"$d\""

ব্যবহার: git cd <date_arg>

উদাহরণ:

git cd now  # update the last commit time to current time
git cd '1 hour ago'  # set time to 1 hour ago

সম্পাদনা করুন: এখানে একটি আরও স্বয়ংক্রিয় সংস্করণ রয়েছে যা সূচীটি পরিষ্কার (চূড়ান্ত কোনও পরিবর্তন নেই) পরীক্ষা করে এবং শেষ প্রতিশ্রুতি বার্তাটি পুনরায় ব্যবহার করে, বা অন্যথায় ব্যর্থ হয় (বোকা-প্রমাণ):

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && \
        git diff-index --cached --quiet HEAD --ignore-submodules -- && \
        GIT_COMMITTER_DATE=\"$d\" git commit --amend -C HEAD --date \"$d\"" \
        || echo >&2 "error: date change failed: index not clean!"

17

আমি পুরানো কমিটের তারিখ পরিবর্তন করতে এই এনপিএম প্যাকেজটি তৈরি করেছি।

https://github.com/bitriddler/git-change-date

নমুনা ব্যবহার:

npm install -g git-change-date
cd [your-directory]
git-change-date

নতুন তারিখ প্রবেশের জন্য আপনাকে যে পরিবর্তনটি সংশোধন করতে চান তা চয়ন করতে অনুরোধ জানানো হবে।

আপনি যদি নির্দিষ্ট হ্যাশ দ্বারা একটি প্রতিশ্রুতি পরিবর্তন করতে চান এটি চালান git-change-date --hash=[hash]


আমি কেবল বলতে চেয়েছিলাম যে এটি দুর্দান্ত এবং সুন্দরভাবে কাজ করেছে। ধন্যবাদ, আপনি আমাকে অনেক সময় বাঁচিয়েছেন!
পরানজা

17

নিম্নলিখিত শাখাগুলি বর্তমান শাখায় যে কোনও প্রতিশ্রুতিবদ্ধতার সময় পরিবর্তন করবে।

আপনি যদি ইতিমধ্যে প্রতিশ্রুতিটি ঠেলে থাকেন বা যদি আপনি অন্য কোনও শাখায় প্রতিশ্রুতি ব্যবহার করেন তবে ব্যবহার না করার বিষয়ে সতর্ক হন।

# rewrite_commit_date(commit, date_timestamp)
#
# !! Commit has to be on the current branch, and only on the current branch !!
# 
# Usage example:
#
# 1. Set commit 0c935403 date to now:
#
#   rewrite_commit_date 0c935403
#
# 2. Set commit 0c935403 date to 1402221655:
#
#   rewrite_commit_date 0c935403 1402221655
#
rewrite_commit_date () {
    local commit="$1" date_timestamp="$2"
    local date temp_branch="temp-rebasing-branch"
    local current_branch="$(git rev-parse --abbrev-ref HEAD)"

    if [[ -z "$date_timestamp" ]]; then
        date="$(date -R)"
    else
        date="$(date -R --date "@$date_timestamp")"
    fi

    git checkout -b "$temp_branch" "$commit"
    GIT_COMMITTER_DATE="$date" git commit --amend --date "$date"
    git checkout "$current_branch"
    git rebase "$commit" --onto "$temp_branch"
    git branch -d "$temp_branch"
}

1
আপনার সেখানে একটি বাগ রয়েছে: if [[ -z "$commit" ]]->if [[ -z "$date_timestamp" ]]
ব্লুফাস্ট

নিস! GIT_COMMITTER_DATE=তারিখ নির্দিষ্ট রাখতে পরবর্তী কোনও ম্যানুয়াল প্রতিশ্রুতি রোধ করতে আমি পদ্ধতিটির শেষে সেট করার পরামর্শ দেব ।
লুপকিন

@ লুপকিন, GIT_COMMITTER_DATE ঠিক "গিট কমিট" কমান্ডের জন্য সেট করা আছে সুতরাং এর পরে এটি পরিষ্কার করার দরকার নেই
নিম্রডম ২r

@ নিম্রডম, আমি আবার পরীক্ষা করেছি এবং আপনি সঠিক are যে ইশারা জন্য ধন্যবাদ।
লুপকিন

12

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

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"

10

আপনি যদি অন্য কোনও প্রতিশ্রুতি দেওয়ার সঠিক তারিখ পেতে চান (বলুন যে আপনি একটি প্রতিশ্রুতি সম্পাদন করেছেন এবং এটি প্রাক-রিবেস সংস্করণের তারিখটি চান):

git commit --amend --date="$(git show -s --format=%ai a383243)"

এটি হেড প্রতিশ্রুতিবদ্ধতার তারিখটিকে ঠিক a383243 এর প্রতিশ্রুতিবদ্ধ হওয়ার তারিখটিকে সংশোধন করে (অস্পষ্টতা থাকলে আরও অঙ্কগুলি অন্তর্ভুক্ত করে)) এটি একটি সম্পাদক উইন্ডোও পপআপ করবে যাতে আপনি কমিট বার্তাটি সম্পাদনা করতে পারেন।

এটি সেই লেখকের তারিখের জন্য যা আপনি সাধারণত যত্নবান হন - প্রতিশ্রুতিবদ্ধতার তারিখের জন্য অন্যান্য উত্তর দেখুন।


7

আপনি যদি স্ট্যান্ডার্ড উইন্ডোজ কমান্ড লাইনে স্বীকৃত উত্তর ( https://stackoverflow.com/a/454750/72809 ) সম্পাদন করতে চান তবে আপনার নিম্নলিখিত কমান্ডটি প্রয়োজন:

git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE='2009-10-16T16:00+03:00'; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"

মন্তব্য:

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

কলিন সোভিনজেনের একটি ব্লগ পোস্টে অনেক ধন্যবাদ । যদিও তার কোডটি আমার পক্ষে কাজ করে নি, এটি আমাকে সঠিক সমাধান খুঁজে পেতে সহায়তা করেছিল।


7

যদি প্রতিশ্রুতি দেওয়া না হয় তবে আমি এরকম কিছু ব্যবহার করতে পারি:

git commit --amend --date=" Wed Mar 25 10:05:44 2020 +0300"

এর পরে গিট ব্যাশ ইতিমধ্যে প্রয়োগের তারিখ দিয়ে সম্পাদকটি খোলার জন্য আপনাকে VI-এডিটর কমান্ড মোড ": wq" টাইপ করে এটি সংরক্ষণ করতে হবে এবং আপনি এটি চাপতে পারেন


2
কেবলমাত্র উত্তরের উত্তরে যুক্ত করুন: আপনি যদি প্রতিশ্রুতি বার্তাটি সম্পাদনা করতে না চান (আপনি যদি কমিটের তারিখটি পরিবর্তন করতে চান তবে) --no-editবিকল্পটি ব্যবহার করুন ।
আন্তোনিও ভিনিসিয়াস মেনেইজেস মেডিই

এছাড়াও, যদি প্রতিশ্রুতি ইতিমধ্যে ঠেলাঠেলি করা হয়, আপনি এখনও পরিবর্তিত প্রতিশ্রুতি git push -f(জোর করে আপডেট) ব্যবহার করে চাপতে পারেন । যদিও এর পার্শ্ব প্রতিক্রিয়া হতে পারে। (বিশেষত যদি অনেক লোকের কাছে
ভান্ডারটির


2

ইতিমধ্যে অনেক দুর্দান্ত উত্তর রয়েছে, তবে যখন আমি একদিনে বা এক মাসে একাধিক কমিটির তারিখ পরিবর্তন করতে চাই, তখন আমি সঠিক উত্তর খুঁজে পাই না। সুতরাং আমি ব্যাখ্যা সহ এটির জন্য একটি নতুন স্ক্রিপ্ট তৈরি করি, আশা করি এটি কারও সহায়ক হবে:

#!/bin/bash

# change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800
# you can change the data_match to change all commits at any date, one day or one month
# you can also do the same for GIT_COMMITTER_DATE

git filter-branch --force --env-filter '

date_match="^Thu, 14 Sep 2017 13+"              

# GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format 
author_data=$GIT_AUTHOR_DATE;                   
author_data=${author_data#@}                  
author_data=${author_data% +0800}                # author_data is 1505367581     

oneday=$((24*60*60))

# author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format
author_data_str=`date -R -d @$author_data`      

if [[ $author_data_str =~ $date_match ]];
then
    # remove one day from author_data
    new_data_sec=$(($author_data-$oneday))
    # change to git internal format based on new_data_sec
    new_data="@$new_data_sec +0800"             
    export GIT_AUTHOR_DATE="$new_data"
fi
' --tag-name-filter cat -- --branches --tags

তারিখটি পরিবর্তন করা হবে:

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