কমিট টাইমস্ট্যাম্পগুলি পরিবর্তন না করে গিট রিবেস


157

git rebaseপ্রতিশ্রুতিবদ্ধ টাইমস্ট্যাম্পগুলি সংরক্ষণ করার সময় এটি সম্পাদন করার অর্থ কী?

আমি বিশ্বাস করি এর ফলস্বরূপ হবে যে নতুন শাখা অগত্যা তারিখগুলি কালানুক্রমিকভাবে সম্পাদন করবে না। এটি কি তাত্ত্বিকভাবে আদৌ সম্ভব? (যেমন নদীর গভীরতানির্ণয় কমান্ড ব্যবহার করে; এখানে কেবল কৌতূহলী)

যদি এটি তাত্ত্বিকভাবে সম্ভব হয়, তবে টাইমস্ট্যাম্পগুলি পরিবর্তন না করে, পুনরায় ব্যবহারের সাথে অনুশীলন করা সম্ভব?

উদাহরণস্বরূপ, ধরে নিন আমার কাছে নিম্নলিখিত গাছ রয়েছে:

master <jun 2010>
  |
  :
  :
  :     oldbranch <feb 1984>
  :     /
oldcommit <jan 1984>

এখন, আমি যদি রি-বেসের ফলে oldbranchউপর master, তারিখ জুন 2010 থেকে ফেব্রুয়ারী 1984 থেকে পরিবর্তন কমিট এটা কি সম্ভব যে আচরণ পরিবর্তন করার জন্য, যাতে কমিট টাইমস্ট্যাম্পের পরিবর্তন হয়? শেষ পর্যন্ত আমি এইভাবে পাবেন:

      oldbranch <feb 1984>
      /
 master <jun 2010>
    |
    :

তা কি আদৌ বুঝবে? এমনকি পুরানো প্রতিশ্রুতিবদ্ধ পিতা বা মাতা হিসাবে আরও সাম্প্রতিক প্রতিশ্রুতি আছে এমন কি ইতিহাসেরও অনুমতি দেওয়া যায়?


3
এটি মজার বিষয় যে প্রশ্নের উত্তরটি হ'ল "আপনার কিছু করার দরকার নেই - এটি ডিফল্ট হিসাবে কাজ করে"। তবে এখন ধরুন আপনি রিবেস করার সময় সঠিক তারিখের ক্রম অনুসারে বাছাই করতে প্রতিশ্রুতি চান (এটি সম্পর্কে যদি আপনি ভাবেন তবে বেশ প্রাকৃতিক দৃশ্য)। এখন আমি যে কিভাবে অর্জন করা খুঁজে পেতে সক্ষম ছিল না এবং আমার কুই পোস্ট stackoverflow.com/questions/12270357/really-flatten-a-git-merge
pfalcon

1
ডেভিড committer তারিখ রিসেট করতে অন্য কোনো বিকল্প উল্লেখ: git rebase --committer-date-is-author-date SHA। দেখুন নীচের আমার সম্পাদিত উত্তর
VonC

আমি ঠিক একটি অনুরূপ প্রশ্নের উপর একটি বিস্তৃত উত্তর লিখেছিলাম যার লেখক এখানে বর্ণিত উত্তরগুলি চেষ্টা করেছেন এবং সন্তোষজনক উপায়ে এগুলি প্রয়োগ করতে পারেন নি।
axiac

উত্তর:


149

জুন ২০১৪ আপডেট করুন: ডেভিড ফ্রেজার মন্তব্যগুলিতে " গিট ব্রাঞ্চকে ছাড় দেওয়ার সময় টাইমস্ট্যাম্পগুলি পরিবর্তন করুন " এ বিকল্পটি ব্যবহার করে --committer-date-is-author-date(প্রাথমিকভাবে জানুয়ারী ২০০৯-এ প্রবর্তিত 3f01ad6-তে প্রবর্তিত ) মন্তব্যে উল্লেখ করেছেন

নোট করুন যে --committer-date-is-author-dateবিকল্পটি লেখককে টাইমস্ট্যাম্প ছেড়ে চলেছে এবং প্রতিশ্রুতিবদ্ধ টাইমস্ট্যাম্পটিকে মূল লেখকের টাইমস্ট্যাম্পের সমান হিসাবে সেট করেছে, যা ওপি অলিভিয়ার ভার্ডিয়ার চেয়েছিলেন।

আমি সঠিক তারিখ সহ শেষ প্রতিশ্রুতিটি পেয়েছি এবং করেছি:

git rebase --committer-date-is-author-date SHA

দেখুন git am:

--committer-date-is-author-date

ডিফল্টরূপে কমান্ডটি ইমেল বার্তা থেকে কমিট লেখকের তারিখ হিসাবে তারিখটি রেকর্ড করে এবং প্রতিশ্রুতিবদ্ধতার তারিখ হিসাবে কমিট তৈরির সময়কে ব্যবহার করে।
এটি ব্যবহারকারীকে লেখকের তারিখের মতো একই মান ব্যবহার করে প্রতিশ্রুতিবদ্ধতার তারিখ সম্পর্কে মিথ্যা বলতে দেয়


(আসল উত্তর, জুন ২০১২)

অ-ইন্টারেক্টিভ রিবেসের জন্য আপনি চেষ্টা করতে পারেন

git rebase --ignore-date

(এই SO উত্তর থেকে )

এটি পাস হয়েছে git am, যা উল্লেখ করেছে:

 --ignore-date

ডিফল্টরূপে কমান্ডটি ইমেল বার্তা থেকে কমিট লেখকের তারিখ হিসাবে তারিখটি রেকর্ড করে এবং প্রতিশ্রুতিবদ্ধতার তারিখ হিসাবে কমিট তৈরির সময়কে ব্যবহার করে।
এটি ব্যবহারকারীকে দায়বদ্ধতার তারিখের মতো একই মান ব্যবহার করে লেখকের তারিখ সম্পর্কে মিথ্যা বলতে দেয়।

এর জন্য git rebase, এই বিকল্পটি "- ইন্টারেক্টিভ বিকল্পের সাথে বেমানান"।

আপনি যেহেতু পুরানো কমিটের তারিখের সময়সীমাটি পরিবর্তন করতে পারেন (সাথে git filter-branch), আমি মনে করি আপনি যে কোনও কমিটের তারিখের আদেশ চান / প্রয়োজনের সাথে আপনার গিট ইতিহাসকে সংগঠিত করতে পারেন, এমনকি এটি ভবিষ্যতে সেট করেও !


অলিভিয়ার তাঁর প্রশ্নের মধ্যে যেমন উল্লেখ করেছেন, লেখকের তারিখটি কখনই কোনও রিবেস দ্বারা পরিবর্তিত হয় না;
থেকে প্রো গীত বুক :

  • লেখক হলেন সেই ব্যক্তি যিনি মূলত রচনাটি লিখেছিলেন,
  • যদিও প্রতিশ্রুতিবদ্ধ ব্যক্তি সেই ব্যক্তি যিনি সর্বশেষে কাজটি প্রয়োগ করেছিলেন।

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

অতিরিক্ত স্পষ্ট করার জন্য, উদাহরণস্বরূপ, অলিভিয়ার মন্তব্য হিসাবে:

--ignore-dateআমি যা অর্জন করার চেষ্টা হয়েছিল তার বিপরীত কাজ করে !
যথা, এটি লেখকের টাইমস্ট্যাম্প মুছে ফেলে এবং কমিট টাইমস্ট্যাম্পগুলির সাথে তাদের প্রতিস্থাপন করে!
সুতরাং আমার প্রশ্নের সঠিক উত্তর হ'ল:
কিছুই করবেন না, যেহেতু git rebase আসলে লেখকদের টাইমস্ট্যাম্পগুলি ডিফল্টরূপে পরিবর্তন করে না।



1
প্রতিশ্রুতিবদ্ধ স্বেচ্ছাসেবী তারিখগুলি সম্পর্কে আকর্ষণীয়। তবে, git rebase --ignore-dateকাজ করে না। এটি প্রত্যাবর্তিত কমিটির তারিখ পরিবর্তন করে।
অলিভিয়ার ভারদিয়ার

@ অলিভার: অদ্ভুত: আপনি কি একটি অ- ইন্টারেক্টিভ রিবেস তৈরি করেছেন ? এবং লেখকের তারিখ এবং কমিটির তারিখের মধ্যে, আমরা কি "ডান" তারিখটি নিরীক্ষণ করতে নিশ্চিত?
ভনসি

1
ধন্যবাদ ভনসি, লেখক এবং প্রতিশ্রুতিবদ্ধ টাইমস্ট্যাম্পের মধ্যে পার্থক্য, যা এটিকে হঠাৎ করে পরিষ্কার করে দেয়। আমি আমার প্রশ্নের উত্তরটি আমার পোস্টে লিখেছি, তবে সেটিকে প্রতিফলিত করতে আপনার উত্তরটি মানিয়ে নিতে নির্দ্বিধায় অনুভব করছি।
অলিভিয়ার ভারদিয়ার

4
: আরও ভালো হবে --ignore-dateনা বিপরীত আমি যা অর্জন করার চেষ্টা হয়েছিল! যথা, এটি লেখকের টাইমস্ট্যাম্প মুছে ফেলে এবং কমিট টাইমস্ট্যাম্পগুলির সাথে তাদের প্রতিস্থাপন করে! সুতরাং আমার প্রশ্নের সঠিক উত্তর হ'ল: কিছুই করবেন না, যেহেতু git rebaseআসলে লেখকদের টাইমস্ট্যাম্পগুলি ডিফল্টরূপে পরিবর্তন করে না।
অলিভিয়ার ভারদিয়ার

5
নোট করুন যে --committer-date-is-author-dateবিকল্পটি লেখকের টাইমস্ট্যাম্পটি ছেড়ে গেছে এবং প্রতিশ্রুতিবদ্ধ টাইমস্ট্যাম্পটিকে মূল লেখকের টাইমস্ট্যাম্পের মতো করে সেট করেছে যা অলিভিয়ার চেয়েছিল ...
ডেভিড ফ্রেজার

118

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

git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'


1
আমি কেবল এটি চেষ্টা করেছিলাম, কিন্তু কোনও ফল হয়নি। আমি folowing আউটপুট করেছেন: WARNING: Ref 'refs/heads/master' is unchanged। আমি লিনাক্সে (64৪ বিট) গিট সংস্করণটি 1.7.9.5 ব্যবহার করছি
মার্কাস এন।

20
আপনি যদি ইতিমধ্যে ভুল হয়ে গিয়েছিলেন তবে পুরো ইতিহাসটি পুনরাবৃত্তি করতে না চান তবে আমি অন্য পদ্ধতিটি যুক্ত করতে চাই: git rebase --committer-date-is-author-date <base_branch> এইভাবে, গিটটি <base_branch> উপর প্রয়োগকৃত কমিটগুলির জন্য কমিটের তারিখটি পুনরায় সেট করবে (সম্ভবত এটি আপনি স্ক্রু করার সময় একই শাখার নাম ব্যবহার করেছিলেন)।
স্পোকম্যান

গৃহীত উত্তর ২০১ 2016 সালে কাজ করেনি, তবে @ স্পিকারের উত্তরটি করেছে!
থিওডোর আর স্মিথ

2
@ স্পোকম্যানের উত্তরটি অক্টোবর ২০১ in এ কার্যকর হয়নি, তবে অ্যান্ডি তা করেছে!
আমেদী ভ্যান গ্যাস

2
এটি উইন্ডোজে কাজ করে না। আমি এটি উইন্ডোজ ব্যাশ ব্যবহার করে কাজ করতে সক্ষম হয়েছি।
vaindil

33

ভন সি-এর একটি গুরুত্বপূর্ণ প্রশ্ন আমাকে কী হতে চলেছে তা বুঝতে সাহায্য করেছে: যখন আপনার পুনর্বাসনের সময়, প্রতিশ্রুতিবদ্ধতার টাইমস্ট্যাম্প পরিবর্তিত হয়, তবে লেখকের টাইমস্ট্যাম্পটি নয়, যা হঠাৎ করে সমস্ত ধারণা তৈরি করে। সুতরাং আমার প্রশ্ন আসলে যথেষ্ট সুনির্দিষ্ট ছিল না।

উত্তরটি হ'ল রিবেস আসলে লেখকের টাইমস্ট্যাম্পগুলি পরিবর্তন করে না (এর জন্য আপনাকে কিছু করার দরকার নেই), যা আমার পুরোপুরি ফিট করে।


3
+1 - আমার কাছে জায়গায় একটি গিটার ওরফে রয়েছে ( কোডারওয়াল.com / p / euwpig / a-better- git- log ) যা দৃ the়ভাবে প্রতিবেদকের টাইমস্ট্যাম্পটি ব্যবহার করে যা আমাকে বিভ্রান্ত করেছিল। গিটক এবং গিট লগ উভয়ই লেখকের টাইমস্ট্যাম্প দেখায়।
1615903

15

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

প্রথমে নিশ্চিত করুন যে আপনি যে প্রতিশ্রুতি পুনঃবাস করতে চলেছেন তার প্রত্যেকটিরই একটি অনন্য প্রতিশ্রুতি বার্তা এবং লেখকের টাইমস্ট্যাম্প রয়েছে (এটি এখানে কৌশলটির উন্নতির দরকার রয়েছে, যদিও এটি বর্তমানে আমার প্রয়োজন অনুসারে)।

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

#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog

তারপরে, আসল রিবেসটি করা যাক।

অবশেষে, আমরা যদি প্রতিশ্রুতিবদ্ধ বার্তাটি একইভাবে ব্যবহার করে অনুরূপ হয় তবে আমরা বর্তমান প্রতিজ্ঞার টাইমস্ট্যাম্পটিকে ফাইলটিতে রেকর্ড করা প্রতিস্থাপন করব git filter-branch

 git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'

যদি কিছু ভুল হয়ে যায় তবে কেবল চেকআউট git reflogবা সমস্ত refs/original/রেফারেন্স।

Furthormore, আপনি একই কাজ করতে পারেন লেখকের টাইমস্ট্যাম্প।

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

git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog
join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_
mv hashlog_ hashlog
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'

এটি একটি দুর্দান্ত কৌশল! এটি আমাকে অন্য উত্তরগুলি ব্যবহার করে 1100+ এর পরিবর্তে 75 টি কমিট পুনরায় লেখার অনুমতি দিয়েছে।
এডিট করুন

এটি চমৎকার! মূল প্রতিশ্রুতিবদ্ধ এছাড়াও সংরক্ষণ করার জন্য স্ক্রিপ্ট পরিবর্তন করার কোনও উপায় আছে?
ডেভিড ডিমার

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