প্রদত্ত প্রতিশ্রুতির জন্য পুশ ডেট পাওয়ার গিটের কোনও উপায় আছে কি?


96

গিট লগে প্রতিটি কমিটের সাথে সম্পর্কিত কোনও পুশ ডেট দেখার কোনও উপায় আছে কিনা তা আমি ভাবছি। যদি এটি সম্ভব না হয় তবে একটি নির্দিষ্ট ধাক্কায় সমস্ত কমিটগুলি দেখার উপায় আছে কি?

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

উত্তর:


78

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

# required for a bare repo
git config core.logAllRefUpdates true

git reflog --date=local master

শেষ অবধি সহজ।

সতর্কতা: আপনি সম্ভবত এর ডিফল্ট মান ওভাররাইড করতে চান gc.reflogExpireএবং gc.reflogExpireUnreachable। এটি git help reflogকীভাবে এবং কেন কাজ করে তা বিশদ অনুসন্ধানের জন্য এবং দেখুন ।

উপরের দুটি কমান্ড অবশ্যই আপনার যে ক্লোনটির দিকে ঠেলেছে তার ভিতরে চালিত হবে । যদি এটি সম্ভব না হয় তবে অন্য একটি স্থায়ী ক্লোনায় একটি আনুমানিক চলতে হবে :

git fetch               origin        # often and *regularly*
git reflog --date=local origin/master

এই স্থায়ী ক্লোনটি কখনও মুছবেন না বা আপনি তারিখগুলি হারাবেন।


4
আমি এটি যুক্ত করতে চাই যে আমার ক্ষেত্রে পুশের তালিকা দেখতে আমাকে git reflog --date=local origin/master(নোট origin/) করতে হয়েছিল। অন্যথায় কেবল কমিট, চেকআউট এবং টানগুলি তালিকায় ছিল (এটিও কার্যকর useful আসলে, আমি জোনাথনডয়ের উত্তরটি দ্বারা এটিকে দেখিয়েছি ।
এনআইএ

@ এনআইএ: উত্স / মাস্টার আপনাকে কেবল একটি আনুমানিক পরিমাণ দেবে। আমি আপনার মন্তব্যের পরে আমার উত্তর আপডেট করেছি, এটি কি স্পষ্ট করে?
মার্চএইচ

37

গিট একটি বিতরণযোগ্য সংস্করণ নিয়ন্ত্রণ সিস্টেম, সুতরাং আপনাকে "পুশ ডেট" বলতে কী বোঝাতে হবে তা যত্ন সহকারে নির্ধারণ করতে হবে। উদাহরণস্বরূপ, ধরুন যে ব্যবহারকারী এ ব্যবহারকারীর বি এর সংগ্রহস্থলের প্রতি কিছু প্রতিশ্রুতিবদ্ধ। কিছুক্ষণ পরে, ব্যবহারকারী বি সেই একই প্রতিশ্রুতিগুলি তৃতীয় সংগ্রহস্থলের দিকে ঠেলে দেয়। আপনি কোন তারিখে আগ্রহী?

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

খারাপ খবর

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

ভাল খবর

ভাগ্যক্রমে, গিটের নোটস নামে একটি (তুলনামূলকভাবে নতুন) বৈশিষ্ট্য রয়েছে । এই বৈশিষ্ট্যটি আপনাকে কমিটের সাথে স্বেচ্ছাসেবী পাঠ্য সংযুক্ত করতে দেয়, যা git logপ্রদর্শন করতে পারে। নোটগুলি অন্যদের সাথে সম্পাদনা এবং ভাগ করা যায়।

আপনি নোট বৈশিষ্ট্যটি প্রতিটি "কমিট [[তারিখে]" বার্তাটি যেভাবে ভাগ করা সংগ্রহশালা দ্বারা গ্রহণ করা হয়েছে তেমনভাবে সংযুক্ত করার জন্য সংযুক্ত করতে নোট বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

দেখুন git help notesবিস্তারিত জানার জন্য।

কিভাবে তারিখ রেকর্ড করতে হয়

আমি প্রস্তাব দেওয়া পদ্ধতির এখানে:

  1. post-receiveপ্রতিটি আপডেট হওয়া রেফারেন্সের জন্য প্রতিটি নতুন পৌঁছনীয় কমিটকে হাঁটতে আপনার ভাগ করা সংগ্রহস্থলের হুকটি সংশোধন করুন ।
  2. প্রতিটি প্রতিশ্রুতিবদ্ধতার জন্য, [সংগ্রহশালা_আরল] এর "[ব্যবহারকারীর] মতো কিছু যুক্ত করুন এই প্রতিশ্রুতিটি [রেফ] সাথে [তারিখে]" কমিটের নোটটিতে যুক্ত করুন।

    আপনি refs/notes/received-onডিফল্ট পরিবর্তে এই উদ্দেশ্যে (যেমন ) উত্সর্গীকৃত একটি নোট রেফ ব্যবহার করতে চাইতে পারেন refs/notes/commits। এটি অন্যান্য উদ্দেশ্যে তৈরি করা নোটগুলির সাথে বিরোধগুলি প্রতিরোধ করবে।

  3. receiveআপনার নোটের রেফারেন্সের আপডেটগুলি অস্বীকার করতে আপনার হুকটি সংশোধন করুন (ব্যবহারকারীদের দুর্ঘটনাক্রমে বা উদ্দেশ্যমূলকভাবে নোটগুলির সাথে জগাখিচু করা থেকে বিরত রাখতে)।
  4. সমস্ত ব্যবহারকারীকে তাদের কার্যকারী গাছের ভিতরে থেকে নিম্নলিখিত কমান্ডগুলি চালনা করতে বলুন:

    # Fetch all notes from the shared repository.
    # Assumes the shared repository remote is named 'origin'.
    git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
    
    # Show all notes from the shared repository when running 'git log'
    git config --add notes.displayRef 'refs/remote-notes/origin/*'
    

    এই পদক্ষেপটি প্রয়োজনীয় কারণ গিট ডিফল্টরূপে উজানের স্টোরগুলিতে নন-শাখা, নন-ট্যাগ রেফারেন্সগুলিকে উপেক্ষা করে।

উপরের দিক থেকে অনুমান করা হয় যে রেফারেন্সগুলি কেবলমাত্র উন্নত, কখনই মুছে ফেলা হয় না বা জোর-আপডেট হয়। আপনি সম্ভবত post-receiveএই মামলাগুলি পরিচালনা করতে হুককে "[তারিখে]" নোটগুলিও যুক্ত করতে চান।


আমার ব্লগে আপনার ধারণা ব্যবহার করেছি mnaoumov.wordpress.com/2013/01/31/git-get-push-date
mnaoumov

8
git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

এটি আমার পক্ষে বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে। প্রতিশ্রুতিবদ্ধতার তারিখ (% সিডি) বিভ্রান্তিকর কারণ এটি প্রয়োজনীয়ভাবে পুশ ডেটের মতো নয়। --Date = iso বিকল্পটি পুশ / আনার তারিখটি আউটপুট দেয়

দ্রষ্টব্য, আপনি যদি উত্স / মাস্টার থেকে আনা থাকেন তবে এটি আপনাকে আনার তারিখটি মুদ্রণ করবে; অন্য কেউ প্রতিশ্রুতিবদ্ধ হওয়ার তারিখটি নয়।

 - %h:  abrev. hash
 - %gd: human readable reflog selector
 - %gs: reflog subject
 - %s:  subject/commit message

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

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso

হাই ভিসির অর্থ কি এর অর্থ এই যে "কমান্ডের আউটপুট" উত্স / মাস্টার - ব্যাখ্যাটি দেখায় = '% ক্রেডিট% হ% ক্রেসেট -% সি (হলুদ)% জিডি% ক্রেসেট% সিবি ব্লু (% জিএস)% ক্রেসেট% s' - -ডেট = আইসো "" da4c192cd -origin / মাস্টার @ {2019-02-07 08:13:40 +0100} (টানুন: দ্রুত এগিয়ে) পরীক্ষার রিপোর্টকে উন্নত করুন ", এর অর্থ তারপরে আমার শাখা JIRA এর সামগ্রী 2019-02-07 08:13:40 এ ফাস্ট-ফ্রোয়ার্ডের মাধ্যমে -2542 উত্স / মাস্টার হিসাবে একীভূত হয়েছিল?
সাইমন

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

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

6

একবার দেখুন git reflog show master। সম্ভবত আপনি যে সঠিক ফর্ম্যাটটি চান তা নয়, তবে আপনাকে সঠিক দিকে নির্দেশ করা উচিত।

অন্য ধারণাটি পুশ হুকের ভিতরে একটি স্ক্রিপ্ট চালাচ্ছে।


আমি পুশ হুক চালানো সম্পর্কে ভেবেছিলাম, তবে মনে হচ্ছে এটি একটি শেষ খাদ চেষ্টা উচিত। একটি হুক দিয়ে মনে হয় প্রতিটি ব্যবহারকারীর তাদের প্রতিটি ভান্ডারটিতে সেই হুক থাকতে হবে। আপনি সম্পর্কে আরও নির্দিষ্ট হতে পারেন git reflog show master? আমি প্রতিটি ব্যবহারকারীর স্বতন্ত্র কমিটের পুশ ডেট দেখতে সক্ষম হতে চাই।
justkikuchi

গিট রিফ্লোগ আপনি যে রেপো চালিয়েছেন তার পরিবর্তনের ক্রম দেখায় the তারিখ পাওয়ার সরাসরি উপায় আছে কিনা তা আমি নিশ্চিত নই, তবে .git/logs/refs/heads/masterএতে একটি টাইমস্ট্যাম্প দেখায়।
কার্ল বিলেফেল্ট

4
হুক হিসাবে, এমন হুকগুলি পাওয়া যায় যা আপনি চালিত মেশিনে চালিত হন । যেহেতু ঠেলাঠেলি কেবল নির্দিষ্ট রেপোর সাথে সম্পর্কিত, তাই আমি ধরে নিচ্ছি যে আপনি এটি চালাতে চান এমন একটি নির্দিষ্ট "ধন্য" রেপো রয়েছে o একই জিনিস জন্য যায় git reflog
কার্ল বিলেফেল্ট

5

রিমোটে রিফ্লগ পরিদর্শন সম্পর্কিত এই উত্তর আপনাকে ( https://stackoverflow.com/a/8791295/336905 ) তথ্য সরবরাহ করে যে কোনও শাখাটি এমনকি এর মাধ্যমেও কীভাবে চাপানো হয়েছিল তা প্রদর্শন করে না এমন সাহায্য করে, তবে আপনি স্থানীয় কমিটের তারিখের পরে পরবর্তী ধাক্কা খুঁজে ক্রস-সম্পর্কিত হতে পারে। বোকা-প্রমাণ নয়, তবে আপনি যদি ইতিমধ্যে পোস্ট করা রিচার্ডহানসেনের দুর্দান্ত নোটগুলির পরামর্শটি কার্যকর না করে থাকেন তবে কার্যকর


4
একটি নোট সহ যে রিফ্লোগ origin/branchশুধুমাত্র বর্তমান মেশিনে করা পরিবর্তনগুলি প্রদর্শন করবে , এটি অত্যন্ত কার্যকর! প্রতিদিনের ব্যবহারের জন্য আমি কোনও হুক প্রয়োগ করতে চাই না, তাই একটি সাধারণ প্রশ্নের জন্য "হুম, আমি যখন গত সপ্তাহে এই প্রতিশ্রুতিটি চাপিয়ে দিয়েছি?" - এটা দুর্দান্ত কাজ করে।
এনআইএ

4

আপনি সার্ভারের গিট সংগ্রহস্থলের "অবজেক্ট" ডিরেক্টরিতে কমিট অবজেক্ট ফাইলের ফাইল পরিবর্তন সময়টিও দেখতে পারেন।


3

গিট লেখক তারিখ কমিটডেট থেকে আলাদা কেন?

  • AuthorDate প্রতিশ্রুতি প্রথম তৈরি করা হয় যখন হয়।
  • CommitDate কমিটটি যখন শেষবার সংশোধিত হয়েছিল (উদাঃ রিবেস)।

--prettyফরম্যাটিং বিকল্পগুলি সহ আপনি এটি পেতে পারেন :

       o    %cd: committer date
       o    %cD: committer date, RFC2822 style
       o    %cr: committer date, relative
       o    %ct: committer date, UNIX timestamp
       o    %ci: committer date, ISO 8601 format

সুতরাং, আপনি এবং অন্যান্য বিকাশকারীরা যদি git rebaseআগে কাজ করে থাকেন তবে git pushআপনি কমিটের তারিখটি শেষ করবেন যা লেখকের তারিখের পরে ।

এই আদেশটি প্রতিশ্রুতিবদ্ধতার তারিখটি দেখায়: git log --pretty=fuller


1

আমি অনুমান করি আপনি পুশ তারিখটি পেতে পরবর্তী স্বরলিপিটি ব্যবহার করতে পারেন: গিট লগ-জি - তারিখ = স্থানীয়

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