সিভিএস থেকে গিতে সরানো: $ আইডি $ সমতুল্য?


124

আমি সাধারণ উত্স কোড নিয়ন্ত্রণ সরঞ্জাম সম্পর্কে জিজ্ঞাসা করে একগুচ্ছ প্রশ্ন পড়েছি এবং গিটকে যুক্তিসঙ্গত পছন্দ বলে মনে হয়েছিল। আমার এটি চালিয়ে যাচ্ছে এবং এটি এখনও পর্যন্ত ভাল কাজ করে। সিভিএস সম্পর্কে আমি যে দিকটি পছন্দ করি তা হ'ল সংস্করণ সংখ্যার স্বয়ংক্রিয় বর্ধন।

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

আমি ইম্যাকস ব্যবহার করি। পর্যায়ক্রমে আমি তৃতীয় পক্ষের প্যাকেজগুলির জন্য লিসপ উত্স ফাইলগুলির নতুন সংস্করণটি সন্ধান করি। বলুন আমি একটি ফাইল পেয়েছি, foo.el, যা শিরোনাম অনুসারে, সংস্করণ 1.3; আমি যদি সর্বশেষতম সংস্করণটি সন্ধান করি এবং এটি 1.143 বা 2.6 বা যাই হোক না কেন, আমি জানি আমি অনেক পিছনে আছি।

পরিবর্তে যদি আমি 40-চরিত্রের কয়েকটি দম্পতি দেখতে পাই তবে আমি বুঝতে পারি না কোনটি পরে আছে বা এটি কত পরে তা সম্পর্কে কোনও ধারণা পাব না। আমি কীভাবে পুরানো তার বয়স সম্পর্কে ধারণা পেতে যদি আমাকে নিজেই চেঞ্জলগগুলি পরীক্ষা করতে হয় তবে আমি একেবারে ঘৃণা করব।

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

তাহলে আমার কী বিকল্প আছে? যদি আমি কোনও $ আইডি: $ সমতুল্য না পাই তবে আমি যা খুঁজছি তা কীভাবে আমি সরবরাহ করব?

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

উত্তর:


67

এসএইচএ হ'ল সংস্করণটির একমাত্র উপস্থাপনা (যদিও প্রামাণিক হলেও)। git describeকমান্ড অন্যদের উপলব্ধ করা হয় এবং তাই বেশ ভাল আছে।

উদাহরণস্বরূপ, আমি যখন git describeআমার জাভা ম্যাকচেড ক্লায়েন্ট উত্সের মাস্টার শাখায় চলেছি তখন আমি এটি পেয়েছি :

2.2-16-gc0cd61a

এটি দুটি গুরুত্বপূর্ণ বিষয় বলে:

  1. ২.২ থেকে এই গাছটিতে ঠিক ১ in টি কমিট হয়েছে
  2. সঠিক উৎস গাছ অন্য কারোর ক্লোন উপর প্রদর্শিত হতে পারে।

ধরা যাক, উদাহরণস্বরূপ, আপনি versionএই সংখ্যাটি দেখানোর জন্য উত্সের সাথে একটি ফাইল প্যাকেজ করেছেন (বা বিতরণের জন্য সমস্ত সামগ্রী পুনরায় লিখেছেন)। ধরা যাক যে প্যাকেজযুক্ত সংস্করণটি ছিল 2.2-12-g6c4ae7a(একটি প্রকাশ নয়, তবে একটি বৈধ সংস্করণ)।

আপনি এখন ঠিক কতটা পিছনে রয়েছেন তা দেখতে পারবেন (4 টি কমিট) এবং আপনি 4 টি কি কমিট করে তা দেখতে পাবেন:

# The RHS of the .. can be origin/master or empty, or whatever you want.
% git log --pretty=format:"%h %an %s" 2.2-12-g6c4ae7a..2.2-16-gc0cd61a
c0cd61a Dustin Sallings More tries to get a timeout.
8c489ff Dustin Sallings Made the timeout test run on every protocol on every bui
fb326d5 Dustin Sallings Added a test for bug 35.
fba04e9 Valeri Felberg Support passing an expiration date into CAS operations.

1
আপনি বিকাশকারী শাখাটি মার্জ করার সাথে সাথে এটি ব্যবহার ব্যর্থ হবে, যখন মাস্টারের কিছু হটফিক্স ছিল। শেষ সংস্করণ থেকে কমিটের সংখ্যা পরিবর্তন হবে। কেউ হ্যাশটি নির্ভরযোগ্য নয় কারণ কেউ filter-branchবা কোনও কিছু দিয়ে পুরো জিনিসটি পুনর্নির্মাণ করতে পারে।
LeMike

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

55

এতক্ষণে গিতে $ আইডি: for এর জন্য সমর্থন রয়েছে। README ফাইলটির জন্য এটি সক্ষম করতে আপনি .gitattributes এ "README পরিচয়" লাগিয়েছিলেন । ফাইলের নামের ওয়াইল্ডকার্ডগুলি সমর্থিত। বিশদটির জন্য ম্যান গিটট্রিবিটস দেখুন ।


14
এটি আপনাকে অঙ্কুরের sha1 দেয় তবে কমিটের sha1 দেয় না। দরকারী, প্রতিশ্রুতিবদ্ধ জন্য সনাক্তকারী হিসাবে না।
স্টিফেন জেনিংস

4
গিটটিতে $Id$উল্লিখিত মতো কোনও কীওয়ার্ড সম্প্রসারণ ব্যবস্থা নেই । যা দূরে সঞ্চিত থাকে তা হ'ল যা আপনি পাবেন। যাইহোক, সংস্করণটি প্রতিশ্রুতিবদ্ধ ফাইলগুলির সম্পূর্ণ সংগ্রহের সাথে সম্পর্কিত, বিশেষত একটি ফাইলের নয় (এই ধারণাটি আরসিএসের দিনগুলির একটি অবশিষ্টাংশ, অথবা সম্ভবত এসসিসিএসই এখানে দোষারোপ করছে ... যেহেতু সিভিএস কেবল একটি আরসিএসের কাছে মহিমান্বিত সীমানা, এবং এসভিএন একটি সিভিএস-ওয়ার্কালিকে হওয়ার চেষ্টা করে, এটি আটকে যায়))।
ভোনব্র্যান্ড

32

এটি অপের পক্ষ থেকে অযৌক্তিক অনুরোধ নয়।

আমার ব্যবহারের ক্ষেত্রে:

  1. আমি নিজের ব্যক্তিগত কোডের জন্য গিট ব্যবহার করি, তাই অন্যের সাথে কোনও সহযোগিতা হয় না।
  2. আমি সিস্টেমে বাশ স্ক্রিপ্টগুলি সেখানে রাখি যা /usr/local/binসেগুলি প্রস্তুত হয়ে গেলে intoুকে যেতে পারে ।

আমি এটিতে একই গিট সংগ্রহস্থল সহ তিনটি পৃথক মেশিন ব্যবহার করি। /usr/local/binম্যানুয়াল "ডিফ-ইউ <রেপো সংস্করণ> <সংস্করণে / ইউএসআর / লোকাল / বিন>" না করে আমার বর্তমানে ফাইলটির "সংস্করণ" জেনে ভাল লাগবে ।

আপনারা যারা নেতিবাচক রয়েছেন তাদের কাছে মনে রাখবেন যে সেখানে অন্যান্য ব্যবহারের কেস রয়েছে। গিট সংগ্রহস্থলের ফাইলগুলিকে তাদের "চূড়ান্ত" অবস্থান হিসাবে সহযোগীমূলক কাজের জন্য সবাই গিট ব্যবহার করে না।

যাইহোক, আমি যেভাবে এটি করেছি তা হ'ল সংগ্রহস্থলগুলিতে এই জাতীয় বৈশিষ্ট্য ফাইল তৈরি করা:

cat .git/info/attributes
# see man gitattributes
*.sh ident
*.pl ident
*.cgi ident

তারপরে in আইডি the ফাইলের কোথাও রাখুন (আমি এটি শেবাংয়ের পরে রাখতে চাই)।

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

git commit foo.sh
rm foo.sh
git co foo.sh

এবং তারপরে আপনি প্রসারণটি দেখতে পাবেন, উদাহরণস্বরূপ:

$ head foo.sh
#!/bin/sh

# $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

কিছু ভাল তথ্য হ'ল আমি গিট সংগ্রহস্থলের জন্য সনাক্তকরণের স্ট্রিংটি কীভাবে সক্ষম করব?


3
এটি লক্ষ করা উচিত যে এটি বর্তমান ফাইলটির (ব্লব) সনাক্ত করে, বর্তমান প্রতিশ্রুতি নয়
চার্লসবি

3
কী git coকরার কথা? আমি ত্রুটির বার্তা পেয়েছি " git: 'co' is not a git command. See 'git --help'." এটি কি হওয়া উচিতgit checkout ?
পিটার মর্টেনসেন

23

নিশ্চিত যে এটি কখনই গিতে থাকবে। করতে লিনাস উদ্ধৃত :

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

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

সম্পাদনা করুন: আপনার এটির জন্য অন্য কারো স্ক্রিপ্টগুলি লিখতে বা ব্যবহার করা উচিত, অবশ্যই এটি ম্যানুয়ালি করবেন না।


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

15
হ্যাঁ, মাঝে মাঝে তিনি ভদ্রতার অভাব বোধ করেন তবে তিনি সাধারণত সঠিক হন এবং তিনি অবশ্যই কীওয়ার্ড সম্প্রসারণের বিষয়টিতে রয়েছেন।
বোম্বে

সংস্করণ ট্র্যাকিং প্রয়োজনীয়। গিটটি খাঁটি বিকাশের পাশাপাশি অন্যান্য অনেক অবকাঠামোতে ব্যবহৃত হয় যেখানে কোডটি বুঝতে পারে কিনা তা নির্ধারণ করতে পারে। কিন্তু যখন একটি পুনর্বিবেচনা নিয়ন্ত্রণ ব্যবস্থা স্বেচ্ছাসেবী সামগ্রী সহ ফাইলগুলি ট্র্যাক করতে ব্যবহৃত হয় তখন আপনার অফিসিয়াল রিলিজটি জানার কিছু উপায় থাকতে হবে। গিট, একা যাক গিট লগ মেশিনে নেই যা .ini, .conf, .html এবং অন্যান্য ফাইলগুলি ধাক্কা দিয়েছিল।
rjt

7
লিনাস কীওয়ার্ড সম্প্রসারণের কেবলমাত্র একটি দিক নিয়ে মন্তব্য করেছে - রিলিজ ট্র্যাকিং। তবে এটি এর একমাত্র উদ্দেশ্য নয়। এই উক্তিটি স্পষ্টভাবে একজন ব্যক্তির মনোভাব দেখায়, তবে বিষয়টি সম্পর্কে কার্যকর কিছু বলে না। একটি সাধারণ "রাজনৈতিক উপায় একটি উচ্চতর উপায়ে সুস্পষ্ট রাষ্ট্র" রাজনৈতিক কৌশল এবং জনতা আপনার is সমস্যাটি হ'ল সংজ্ঞা অনুসারে ভিড়, কারণ এটির সমস্ত জুড়ে কেবল একটি মস্তিষ্ক রয়েছে। যা গিট এবং কীওয়ার্ড সম্প্রসারণের সাথে পরিস্থিতি পরিষ্কারভাবে ব্যাখ্যা করে। একজন বোকা বলল "না" এবং সবাই উল্লাস করলেন!
AnrDaemon

1
@ অ্যানারড্যামন কেবল এটিই নয়, এখন থেকে গিটটি $Id$এই identবৈশিষ্ট্যের মাধ্যমে সমর্থন যোগ করেছেন, যেমন এখানে অন্য উত্তরে উল্লিখিত হয়েছে যে এমনকি গিট নিজেই লিনাসের মতের জিম্মি নয়।
orip

21

যেমনটি আমি আগে লিখেছি :

বাজারের মতো ডিএসসিএম সরঞ্জামগুলির সাথে স্বয়ংক্রিয়ভাবে তৈরি হওয়া আইডি ট্যাগগুলি সংবেদনশীল সংস্করণ নম্বর প্রদর্শন করা অসম্ভব কারণ সকলের বিকাশের লাইন অন্যদের থেকে পৃথক হতে পারে। সুতরাং কেউ কোনও ফাইলের "1.41" সংস্করণ উল্লেখ করতে পারে তবে আপনার ফাইলটির "1.41" সংস্করণটি আলাদা।

মূলত, বাজার, গিট এবং অন্যান্য বিতরণকৃত উত্স কোড পরিচালন সরঞ্জামগুলির সাথে $ আইডি any কোনও অর্থ দেয় না।


6
ঠিক আছে, আমি পোস্ট করার আগে এটি পড়েছিলাম এবং সে কারণেই আমি অন্তর্নিহিত সমস্যার আরও সাধারণ সমাধান চেয়েছি। আমি মনে করি যে কোনও পৃথক ফাইলের একটি সংস্করণ # থাকার আকাঙ্ক্ষা বৈধ, যেমন কোনও সমাধান দেওয়ার ক্ষেত্রে গিটের অক্ষমতা।
জো ক্যাসাডন্টে

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

7
"সংস্করণ নম্বর" এর পরিবর্তে হ্যাশটি কেবল থুতু দিয়ে কী হয়েছে? আমি অভ্যন্তরীণ স্ক্রিপ্টগুলিতে লগ স্টেটমেন্ট, ডিবাগ ওয়েবপৃষ্ঠাগুলি এবং "--version" বিকল্পগুলি চাই যা সহজেই আমাকে জানায় যে কোথায় কোন সংশোধন চলছে, তাই আমি সেই নির্দিষ্ট হ্যাশটি চেকআউট করতে পারি এবং দেখতে পাচ্ছি যে এটি কেন এমনভাবে আচরণ করছে। এটি মোতায়েন করা অ্যাপ্লিকেশনগুলির পরিচালনা সহজতর করে .... এবং আমি কিছু প্রতিশ্রুতিবদ্ধ হুক চাই না যা প্রতিটি প্রতিশ্রুতিতে এতে একটি $ আইডি $ ট্যাগ থাকা প্রতিটি ফাইলের পরিবর্তন হিসাবে বিবেচিত হয়।
nairbv

1
আপনি যে ফাইলটিতে কাজ করছেন তার হ্যাশ "সংস্করণ" হিসাবে একই কাজ করবে, আপনি যতক্ষণ না এই আইডি দ্বারা
গিটটিতে

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

10

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

আমি এটি একটি গিট প্রি-কমিট হুক দিয়ে করেছি এবং আমার স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে আপডেট করতে সক্ষম হয়ে গেছে।

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

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

MYVERSION = '1.090'
## Call script to do updateVersion from .git/hooks/pre-commit
def updateVersion
  # We add 1 because the next commit is probably one more - though this is a race
  commits = %x[git log #{$0} | grep '^commit ' | wc -l].to_i + 1
  vers = "1.%0.3d" % commits

  t = File.read($0)
  t.gsub!(/^MYVERSION = '(.*)'$/, "MYVERSION = '#{vers}'")
  bak = $0+'.bak'
  File.open(bak,'w') { |f| f.puts t }
  perm = File.stat($0).mode & 0xfff
  File.rename(bak,$0)
  File.chmod(perm,$0)
  exit
end

এবং তারপরে আমি স্ক্রিপ্টে একটি কমান্ড-লাইন বিকল্প (-updateVersion) যুক্ত করি তাই যদি আমি এটিকে "টুল-আপডেট সংস্করণ" হিসাবে ডাকে তবে এটি কেবলমাত্র সরঞ্জামটির জন্য আপডেট সংস্করণ কল করে যা "MYVERSION" মানটিকে নিজের মধ্যে পরিবর্তন করে এবং তারপরে প্রস্থান করে (আপনি পারতেন এটি চাইলে অন্য ফাইলগুলি ওপেন করা হয় যদি আপনি চান তবে)।

এটি সেটআপ হয়ে গেলে আমি গিটের মাথায় গিয়ে একটি এক্সিকিউটেবল ওয়ান-লাইন বাশ স্ক্রিপ্ট তৈরি করি .git/hooks/pre-commit

স্ক্রিপ্টটি সহজেই গিট ডিরেক্টরিটির শিরোনামে পরিবর্তিত হয় এবং এর সাথে আমার স্ক্রিপ্টকে কল করে -updateVersion

প্রতিবার আমি প্রি-কমিট স্ক্রিপ্টটি যাচাই করে দেখি যা আমার স্ক্রিপ্টটি আপডেট সংস্করণ দিয়ে চালায় এবং তারপরে কমিটের সংখ্যাটি কী হবে তার ভিত্তিতে MYVERSION ভেরিয়েবল আপডেট করা হয়। ম্যাজিক!


তাহলে কি আপনার রুবি স্ক্রিপ্টকে আপডেট সংস্করণ বলা উচিত git updateVersion? এটি কীভাবে বলা হয় তার কয়েকটি নমুনা রাখুন।
rjt

আমি যে স্ক্রিপ্টটি যাচাই করেছিলাম এটিতে 'অপডেট ভার্সন' বিকল্প বলে একটি বিকল্প তৈরি করি (এই ক্ষেত্রে আমি স্ক্রিপ্টের সংস্করণ নম্বরটি পরিবর্তনের চেষ্টা করছি)। তারপরে আমি কেবলমাত্র একটি অনিলিনার শেল কমান্ড তৈরি করি যা আমার স্ক্রিপ্টকে -আপডেট সংস্করণ দিয়ে কল করে এবং তারপরে এটি প্রতিটি চেকইনের আগেই নিজেকে আপডেট করে।
ডেভিড লাজং ম্যাডিসন স্টেলার

8

যদি আপনার জন্য $ কীওয়ার্ডস having থাকা অপরিহার্য হয়, তবে সম্ভবত আপনি পরিবর্তে মার্চুরিয়াল দেখার চেষ্টা করতে পারেন ? এটিতে এইচজিকিওয়ার্ড এক্সটেনশন রয়েছে যা আপনি যা চান তা প্রয়োগ করে। মার্চুরিয়াল কোনওভাবেই ডিভিসিএস হিসাবে আকর্ষণীয়।


8

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

কোনও ট্যাগ চেক করা সহজ। উদাহরণস্বরূপ, যদি কোনও ট্যাগ থাকে তবে v1.1আপনি সেই শাখায় এই ট্যাগটি চেক আউট করতে পারেন:

git checkout -b v1.1

এটি একটি শীর্ষ স্তরের অবজেক্ট হিসাবে, আপনি সেই প্রতিশ্রুতিটির পুরো ইতিহাসটি দেখতে পাবেন, পাশাপাশি বিভিন্নতা চালাতে, পরিবর্তন করতে এবং মার্জ করতে সক্ষম হবেন।

কেবল তা-ই নয়, তবে একটি ট্যাগ অবিরত থাকে, এমনকি এটি যে শাখাটি চালু ছিল তা মুখ্য লাইনে ফিরে না গিয়ে মুছে ফেলা হয়েছে।


6
তারপরে, এই ট্যাগটি গিটের মাধ্যমে স্বয়ংক্রিয়ভাবে ফাইলটিতে intoোকানোর কোনও উপায় আছে কি? ধন্যবাদ!
জো ক্যাসাডন্টে

1
আপনি কিওয়ার্ড এক্সপেনশন বলতে চাইছেন? আমি যতদূর জানি না। আপনি যদি পণ্য তৈরি করে থাকেন তবে আপনি আপনার বিল্ড স্ক্রিপ্টের অংশ হিসাবে তথ্যটি পেতে পারেন এবং এটি আপনার বিল্ট প্রোডাক্টের মধ্যে কোথাও sertোকাতে পারেন। ম্যান গিট-বর্ণনা চেষ্টা করুন যা সর্বশেষতম ট্যাগ দেয়, এই ট্যাগের পরে কমিটের সংখ্যা এবং বর্তমান হ্যাশ দেয়।
আবিজার্ন

হ্যাঁ, ট্যাগ এবং অন্যান্য সম্পর্কিত তথ্য এখন export-substবৈশিষ্ট্যের মাধ্যমে গিটের মাধ্যমে স্বয়ংক্রিয়ভাবে ফাইলগুলিতে সম্পাদনা করা যেতে পারে gitattributes(5)। অবশ্যই এটির git archiveজন্য রিলিজ তৈরি করতে ব্যবহারের প্রয়োজন , এবং কেবলমাত্র ফলাফলের ফাইলটিতেই প্রতিস্থাপনের সম্পাদনাগুলি দৃশ্যমান হবে।
গ্রেগ এ উডস

4

যদি আমি সঠিকভাবে বুঝতে পারি তবে, আপনি সর্বশেষ আপডেট হওয়ার পরে আপনি কোনও প্রদত্ত ফাইলে কতগুলি কমিটের ঘটনা ঘটেছে তা জানতে চান।

প্রথমে দূরবর্তী উত্সের পরিবর্তনগুলি পান, তবে সেগুলি আপনার masterশাখায় মার্জ করবেন না :

% git fetch

তারপরে আপনার masterশাখা এবং রিমোটের মধ্যে একটি প্রদত্ত ফাইলে ঘটে যাওয়া পরিবর্তনের একটি লগ পান origin/master

% git log master..origin/master foo.el

এটি আপনাকে সর্বশেষে একীভূত origin/masterকরার পরে দূরবর্তী সংগ্রহস্থলে ঘটেছিল এমন সমস্ত কমিটের লগ বার্তা দেয় master

আপনি যদি কেবল পরিবর্তনগুলির একটি গণনা চান তবে এটিতে পাইপ দিন wc। বলুন, এর মতো:

% git rev-list master..origin/master foo.el | wc -l

1
সুতরাং, লগ ব্যবহার করবেন না: গিট রেভ-তালিকা মাস্টার..অরগিন / মাস্টার | wc -l
ডাস্টিন

4

যদি আপনি কেবল লোকেরা কতটা পুরানো তার ধারণা পেতে সক্ষম হচ্ছেন, গিট তাদেরকে বেশ কয়েকটি সহজ উপায়ে এটি অবহিত করতে পারেন। উদাহরণস্বরূপ, তারা তাদের ট্রাঙ্ক এবং আপনার ট্রাঙ্কে শেষ প্রতিশ্রুতির তারিখগুলি তুলনা করে। তারা git cherryআপনার ট্রাঙ্কে কতগুলি কমিটস ঘটেছে তা তাদের ব্যবহার করতে পারেন যা তাদের উপস্থিত নেই।

আপনি যদি এটির জন্য চান তবে আমি কোনও সংস্করণ নম্বর ছাড়াই এটি সরবরাহ করার উপায় খুঁজতে চাই।

এছাড়াও, যদি না আপনি নিশ্চিত হন তবে আমি কারও কাছে সৌজন্যতা প্রসারিত করতে বিরক্ত করব না। :)


যদি তারিখগুলি তুলনা করা ঠিক থাকে তবে ফাইলটিতে ডেটটাইমস্ট্যাম্প লাগান। গিটটিতে কেবল বিকাশকারীদের তুলনায় অন্যান্য অনেকগুলি ব্যবহারের কেস রয়েছে। ক্ষেত্রের আইটি, ওয়ার্কস্টেশনে .INI বা .conf ফাইলের বর্তমান সমস্যাটির কাছাকাছি যে কোনও জায়গায় সমস্যা সমাধান করা হচ্ছে কিনা তা জানতে হবে।
31'17

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

4

সংগ্রহস্থলের সমস্ত উপ-ডিরেক্টরিতে সমস্ত ফাইলে প্রসারণ প্রয়োগ করতে, সংগ্রহস্থলের .gitattributesশীর্ষ স্তরের ডিরেক্টরিতে ফাইল যুক্ত করুন (যেমন আপনি সাধারণত .gitignoreফাইলটি রাখতেন) এতে অন্তর্ভুক্ত থাকে:

* ident

এটি কার্যকরভাবে দেখতে, আপনাকে প্রথমে ফাইল (গুলি) এর কার্যকর চেকআউট করতে হবে, যেমন কোনও উপায়ে মুছতে বা সম্পাদনা করা। তারপরে এগুলি পুনরুদ্ধার করুন:

git checkout .

এবং আপনার $Id$এমন কিছু দিয়ে প্রতিস্থাপিত হওয়া উচিত :

$Id: ea701b0bb744c90c620f315e2438bc6b764cdb87 $

থেকে man gitattributes:

ident

অ্যাট্রিবিউট পরিচয়টি যখন কোনও পাথের জন্য সেট করা থাকে, তখন গিট ব্লব অবজেক্টে $ আইডি rep এর পরিবর্তে $ আইডি: পরে, 40-অক্ষরের হেক্সাডেসিমাল ব্লব অবজেক্টের নাম, তারপরে ডলার চিহ্ন-পরে চেকআউট হয়। T আইডির সাথে শুরু হওয়া এবং ওয়ার্ট্রি ফাইলটিতে with দিয়ে শেষ হওয়া কোনও বাইট ক্রম চেক ইন করার পরে replaced আইডি $ দিয়ে প্রতিস্থাপন করা হবে।

এই আইডিটি প্রতিবার ফাইলটির নতুন সংস্করণ প্রতিশ্রুতিবদ্ধ হয়ে পরিবর্তন হবে।


3

আরসিএস আইডিগুলি একক-ফাইল প্রকল্পের জন্য দুর্দান্ত, তবে অন্য কোনও ক্ষেত্রে $ আইডি the প্রকল্প সম্পর্কে কিছুই বলেনি (যদি না আপনি জবরদস্তি ডামি চেক-ইনগুলি ডামি সংস্করণ ফাইলটিতে না করেন)।

তবুও একজন প্রতি ফাইল স্তরে বা কমিট স্তরে কীভাবে $ লেখক $, $ তারিখ $, $ রিভিশন $, $ আরসিএসফিল $ ইত্যাদির সমতুল্যতা পাবেন তা আগ্রহী হতে পারে (কিছু কীওয়ার্ড অন্য যেখানে কীভাবে সেগুলি রাখবেন কীভাবে প্রশ্ন)। আমার এগুলির কোনও উত্তর নেই, তবে সেগুলি আপডেট করার প্রয়োজনীয়তাটি দেখুন, বিশেষত যখন ফাইলগুলি (বর্তমানে গিটে) আরসিএস-সামঞ্জস্যপূর্ণ সিস্টেমগুলি (সিভিএস) থেকে উদ্ভূত হয়েছিল।

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

প্রতিটি প্রকল্পের নিজস্ব ডিরেক্টরি থাকে এবং প্রকল্পের মূলটিতে আমার কাছে একটি টেক্সট ফাইল রয়েছে .versionযা বর্তমান সামগ্রীটিকে বর্ণনা করে (সূত্র রফতানির সময় ব্যবহার করা হবে এমন নাম) content

পরবর্তী প্রকাশের জন্য কাজ করার সময় একটি স্ক্রিপ্ট সেই .versionসংখ্যাটি বের করে, কিছু গিট সংস্করণ বর্ণনাকারী (যেমন git describe) এবং .buildচূড়ান্ত প্রোগ্রামের সাথে সংযুক্ত একটি স্বয়ংক্রিয় উত্পন্ন উত্স ফাইলে একটি সংঘবদ্ধ বিল্ড নম্বর (প্লাস হোস্ট এবং তারিখ), যাতে আপনি খুঁজে পেতে পারেন কোন উত্স থেকে এবং কখন এটি নির্মিত হয়েছিল out

আমি পৃথক শাখায় নতুন বৈশিষ্ট্য বিকাশ করি এবং আমি প্রথমে যা করি তা হল n("পরবর্তী" এর জন্য) .versionস্ট্রিংয়ে যুক্ত করা (একই মূল থেকে উত্পন্ন একাধিক শাখা একই অস্থায়ী .versionসংখ্যাটি ব্যবহার করবে )। মুক্তির আগে আমি সিদ্ধান্ত নিয়েছি কোন শাখাগুলি মার্জ হবে (আশা করি সব একই থাকবে .version)। সংশ্লেষ প্রতিশ্রুতিবদ্ধ করার আগে, আমি .versionপরবর্তী সংখ্যাটিতে আপডেট করেছি (মার্জ করা বৈশিষ্ট্যগুলির উপর নির্ভর করে বড় বা ছোট আপডেট)।


3

আপনি যদি চান Git তথ্য কমিট প্রবেশযোগ্য আপনার মধ্যে কোড, তাহলে আপনি আছে সেখানে পেতে একটি প্রাক বিল্ড পদক্ষেপ না। সি / সি ++ এর জন্য ব্যাশে এটি দেখতে এমন কিছু দেখাচ্ছে:

prebuild.sh

#!/bin/bash
commit=$(git rev-parse HEAD)
tag=$(git describe --tags --always ${commit})
cat <<EOF >version.c
#include "version.h"
const char* git_tag="${tag}";
const char* git_commit="${commit}";
EOF

সঙ্গে version.hমত খুঁজছি:

#pragma once
const char* git_tag;
const char* git_commit;

তারপরে, আপনার কোড #include "version.h"এবং রেফারেন্সে git_tagবা প্রয়োজন অনুযায়ী যেখানেই এটি git_commitপ্রয়োজন।

এবং আপনার Makefileকিছু হতে পারে:

all: package
version:
  ./prebuild.sh
package: version
  # the normal build stuff for your project

এর সুবিধা রয়েছে:

  • পেয়ে বর্তমানে জন্য সঠিক মান এই , শাখাবিন্যাস মার্জ চেরি-পিকিং এবং এই ধরনের নির্বিশেষে বিল্ড।

এই বাস্তবায়নের prepublish.shত্রুটিগুলি রয়েছে:

  • git_tag/ git_commitপরিবর্তন না হওয়া সত্ত্বেও একটি পুনরায় কম্পাইল করতে বাধ্য করা ।
  • এটি স্থানীয় পরিবর্তিত ফাইলগুলিকে বিবেচনা করে না যা প্রতিশ্রুতিবদ্ধ হয়নি তবে বিল্ডটিকে কার্যকর করে।
    • ব্যবহার git describe --tags --always --dirtyকরে এই ব্যবহার-কেস ধরা।
  • বৈশ্বিক নাম স্থান দূষিত করে।

prebuild.shএই সমস্যাগুলি এড়াতে পারে এমন কোনও ফ্যানসিয়ার পাঠকের অনুশীলন হিসাবে ছেড়ে যায়।


1

আমি তাদের সাথে একমত যারা যারা মনে করেন যে টোকেন প্রতিস্থাপনটি সংস্করণ নিয়ন্ত্রণ সরঞ্জামগুলির চেয়ে সরঞ্জামগুলি নির্মাণের অন্তর্গত।

মুক্তির ট্যাগ হওয়ার সময় আপনার উত্সগুলিতে সংস্করণ আইডি সেট করতে আপনার কিছু স্বয়ংক্রিয় প্রকাশের সরঞ্জাম থাকা উচিত।


2
.INI .conf এবং .txt এ সাধারণত কোনও বিল্ড টুল থাকে না।
rjt

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

1

ট্যাগের নাম এবং অন্যান্য সম্পর্কিত তথ্য এখন গিট দ্বারা export-substবৈশিষ্ট্যটির মাধ্যমে স্বয়ংক্রিয়ভাবে ফাইলগুলিতে সম্পাদনা করা যেতে পারে gitattributes(5)। অবশ্যই এটির git archiveজন্য রিলিজ তৈরি করতে ব্যবহারের প্রয়োজন , এবং কেবলমাত্র ফলাফলের ফাইলটিতেই প্রতিস্থাপনের সম্পাদনাগুলি দৃশ্যমান হবে।

উদাহরণস্বরূপ .gitattributesফাইলটিতে নিম্নলিখিত লাইনটি রাখুন:

* export-subst

তারপরে উত্স ফাইলগুলিতে আপনি এর মতো একটি লাইন যুক্ত করতে পারেন:

#ident  "@(#)PROJECTNAME:FILENAME:$Format:%D:%ci:%cN:%h$"

এবং এটি এর দ্বারা নির্মিত একটি রিলিজের মতো দেখতে এটি প্রসারিত হবে, উদাহরণস্বরূপ git archive v1.2.0.90:

#ident  "@(#)PROJECTNAME:FILENAME:HEAD -> master, tag: v1.2.0.90:2020-04-03 18:40:44 -0700:Greg A. Woods:e48f949"

0

যেহেতু আপনি ইমাস ব্যবহার করেন, আপনি ভাগ্যবান হতে পারেন :)

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


0

আমি এসসিসি, আরসিএস এবং সিভিএস ( %W% %G% %U%) থেকেও এসেছি ।

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

আমি বেশ কয়েকটি ধরণের কোড (.sh, .go, .ML, .xML, ইত্যাদি) এর জন্য একই সমাধান চেয়েছিলাম। আমি চাইছিলাম গিট বা গিটহাবের জ্ঞান ছাড়াই যে কোনও ব্যক্তি "আপনি কী সংস্করণটি চালাচ্ছেন?" এই প্রশ্নের উত্তর দিতে সক্ষম হন ?

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

https://github.com/BradleyA/markit

git clone https://github.com/BradleyA/markit
cd markit

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