এর গিট সংস্করণ হ্যাশটি স্বয়ংক্রিয়ভাবে মুদ্রণের জন্য আমি কীভাবে আমার সি কোড পেতে পারি?


84

সি কোড লেখার কোনও সহজ উপায় কি এর গিট সংস্করণ হ্যাশ অ্যাক্সেস করতে পারে?

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

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


4
প্রি-কমিট হুক ব্যবহার করা ( book.git-scm.com/5_git_hooks.html দেখুন ) এটি করার আরও একটি উপায় হবে।
ইয়াকতুল

উত্তর:


39

আমার প্রোগ্রামে, আমি গিট সংস্করণ নম্বর এবং বিল্ডের তারিখটিকে পৃথক একটি ফাইলে ধরে রেখেছি, যাকে বলে version.cমনে হচ্ছে:

এখানে একটি শিরোনাম ফাইলও রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

শিরোনাম ফাইল এবং সি ফাইল উভয়ই পার্ল স্ক্রিপ্ট দ্বারা উত্পন্ন হয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

my $git_sha = `git rev-parse HEAD`;
$git_sha =~ s/\s+//g;
# This contains all the build variables.
my %build;
$build{date} = make_date_time ();
$build{git_sha} = $git_sha;

hash_to_c_file ("version.c", \%build, "build_");

এখানে hash_to_c_fileতৈরি সব কাজ করে version.cএবং version.hএবং make_date_timeদেখানো হয়েছে একটি স্ট্রিং করে তোলে।

মূল প্রোগ্রামে আমার একটা রুটিন আছে

আমি গিট সম্পর্কে তেমন জ্ঞানী নই, তাই এর আরও ভাল উপায় থাকলে আমি মন্তব্যগুলিকে স্বাগত জানাব।


4
পার্ল লিপিটি বিল্ড স্ক্রিপ্টের অংশ, যা প্রতিটি কিছুর জন্য "এক পদক্ষেপ বিল্ড"।

12
এটি যতদূর যায় ভাল, তবে মনে রাখবেন যে এটি শাখায় সর্বশেষ কমিটের হ্যাশটির প্রতিবেদন করবে, কোডের হ্যাশ সংকলিত হচ্ছে না। যদি আপত্তিহীন পরিবর্তন হয় তবে সেগুলি সুস্পষ্ট হবে না।
ফিল মিলার

4
আপনার কর্মক্ষেত্র এবং সূচকের মধ্যে পার্থক্যের জন্য ডিফল্ট চেক অনুসারে গিটটি পৃথক করে। আপনি সূচক এবং প্রধানের মধ্যে পার্থক্যের জন্য গিট ডিফ - ক্যাশেড চেষ্টা করতে পারেন
কার্ল

6
এই সমস্ত 'কনস্ট চর "নাম =" মান ";' কনস্ট্রাক্টগুলি সংক্ষিপ্তভাবে 'কনট চর নাম [] = "মান";' তে পরিবর্তন করা যেতে পারে, যা 32-বিট মেশিনে আইটেম প্রতি 4 বাইট এবং 64-বিট মেশিনে আইটেম 8 বাইট সংরক্ষণ করে। মঞ্জুর, প্রধান স্মৃতি গিগাবাইটের এই দিনে, এটি কোনও বড় সমস্যা নয়, তবে এটি সমস্তই সহায়তা করে। নোট করুন যে নাম ব্যবহার করে যে কোনও কোডেরই পরিবর্তন করার প্রয়োজন নেই।
জোনাথন লেফলার

4
আপনার পরামর্শ অনুসারে আমি সেগুলি পরিবর্তন করেছি। আমার প্রোগ্রামটির আকার const char []: 319356 বাইট (ফেলা)। আমার প্রোগ্রামটির const char *আকারটি: 319324 বাইট (স্ট্রিপড)। সুতরাং আপনার ধারণাটি কোনও বাইট সংরক্ষণ করবে না বলে মনে হচ্ছে, তবে মোট সংখ্যা 32 দ্বারা বাড়িয়ে দেবে why কেন তা আমার কোনও ধারণা নেই। মূল "version.c" এ তিনটি স্ট্রিং রয়েছে তবে উপরের উত্তর থেকে একটি বাদ দেওয়া হয়েছিল। আপনি যদি প্রথম সম্পাদনাটি দেখে থাকেন তবে এটি এখনও আছে।

163

আপনি যদি মেক-বেসড বিল্ড ব্যবহার করে থাকেন তবে আপনি এটি মেকফাইলে রাখতে পারেন:

( সুইচগুলি কী করে তার জন্য ম্যান গিট বর্ণনা করে দেখুন )

তারপরে এটি আপনার সিএফএলজিএসে যুক্ত করুন:

তারপরে আপনি প্রোগ্রামে সরাসরি সংস্করণটি উল্লেখ করতে পারেন যেমন এটি একটি # সংজ্ঞা ছিল:

ডিফল্টরূপে এটি কেবল সংক্ষিপ্ত গিট কমিট আইডি প্রিন্ট করে তবে optionচ্ছিকভাবে আপনি এই জাতীয় কিছুতে বিশেষ প্রকাশকে ট্যাগ করতে পারেন:

তারপরে এটি মুদ্রণ করবে:

যার অর্থ, "গত commit 766 ডি" দিয়ে গিট কমিট আইডি দিয়ে ২ টি পূর্ববর্তী ১.১-এর সাথে কমিট করে।

আপনার গাছে যদি অনুমতি না দেওয়া পরিবর্তন হয় তবে এটি "-ডার্টি" যুক্ত হবে।

কোনও নির্ভরতা স্ক্যানিং নেই তাই make cleanসংস্করণটি আপডেট হতে বাধ্য করার জন্য আপনাকে একটি স্পষ্টতই করতে হবে। এটি তবে সমাধান করা যেতে পারে

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


6
+1 ব্যক্তিগতভাবে, আমি মেকফিলটি বিকল্পের #define GIT_VERSION ...সাথে কমান্ড লাইনে রাখার পরিবর্তে একটি শিরোনাম ফাইল তৈরি করতে -Dপছন্দ করি; এটি নির্ভরতা সমস্যা দূর করে। এছাড়াও, কেন ডাবল আন্ডারস্কোর? প্রযুক্তিগতভাবে এটি একটি সংরক্ষিত শনাক্তকারী
ড্যান মোল্ডিং

8
প্রত্যেকটির নিজস্ব - যেমনটি আমি বলছি সুবিধাগুলি হ'ল এর কয়েকটি চলন্ত অংশ রয়েছে এবং সেগুলি বোধগম্য। আন্ডারস্কোরগুলি সরাতে আমি এটি সম্পাদনা করেছি।
ndyer

এটি যুক্ত করা উচিত, আপনি যদি জেনজেপ্ট ব্যবহার করেন তবে এটি মেকফাইলে জেনেটপটটিতে সরাসরি যুক্ত করতে পারে: জেনজেটপেট - সেট-সংস্করণ = $ (জিআইএসভিশন)
ট্রাইগভে

4
প্রথম বিবৃতিটি উদ্ধৃতি সহ হওয়া উচিত GIT_VERSION := "$(shell git describe --abbrev=4 --dirty --always --tags)", উদ্ধৃতিগুলি ছাড়া কাজ করে না।
আবেল টম

11

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

আমার মেকফাইলে এতে একটি লাইন রয়েছে যা এসি ফাইল তৈরি করতে গিট, তারিখ এবং বিশ্রীকে ডাকে:

আমি যখনই আমার কোডটি সংকলন করি, তত্ক্ষণাত্ কমান্ড একটি সংস্করণ। ফাইল তৈরি করে যা দেখে মনে হয়:

আমার কাছে একটি স্ট্যাটিক ভার্সন h ফাইল রয়েছে যা দেখতে এই জাতীয়:

আমার কোডের বাকী অংশগুলি এখন কেবলমাত্র ভার্সন এইচ শিরোনাম সহ বিল্ড-টাইম এবং গিট হ্যাশ অ্যাক্সেস করতে পারে। এগুলি পুরোপুরি लपेटানোর জন্য, আমি আমার গিটগনোর ফাইলে একটি লাইন যুক্ত করে version.c এর সংস্করণ উপেক্ষা করতে বলি। এইভাবে গিট আমাকে ক্রমাগত একীভূত করার বিরোধ দেয় না। আশাকরি এটা সাহায্য করবে!


একটি সংযোজন ... এটি মতলবটিতে
AndyL

4
আমি মনে করি না যে FORCEএটি একটি ভাল ধারণা যেহেতু মেকফিলটি কখনই সন্তুষ্ট হবে না (প্রতিবার আপনাকে নতুন শিরোনাম বানিয়ে তুলবে)। পরিবর্তে, আপনি সূত্রের মধ্যে প্রাসঙ্গিক গিট ফাইলের উপর নির্ভরতা যুক্ত করতে পারেন $(MyLibs)/version.c : .git/COMMIT_EDITMSG .git/HEAD COMMIT_EDITMSGপ্রতিবার আপনি যখন প্রতিশ্রুতিবদ্ধ তখন ফাইল পরিবর্তন হয় এবং HEADআপনি যখন ইতিহাস ব্রাউজ করেন ততবার পরিবর্তিত হয়, সুতরাং আপনার ফাইলটি প্রাসঙ্গিক হওয়ার সাথে সাথে প্রতিটি সময় আপডেট হয়।
কামিল এস জারন

9

আপনার প্রোগ্রামটি git describeরানটাইম বা বিল্ড প্রক্রিয়াটির অংশ হিসাবে শেল আউট করতে পারে।


4
থেকে git help describe: "সর্বাধিক সাম্প্রতিক ট্যাগটি প্রদর্শন করুন যা কোনও কমিটের মাধ্যমে পৌঁছতে পারে" - প্রশ্নটি যা জিজ্ঞাসা করে এটি এটি নয়। যদিও আপনার বাকি উত্তরগুলির সাথে আমি একমত। সঠিক হতে হলে আদেশটি হওয়া উচিত git rev-parse HEAD
মাইক মাজুর

4
@ মিকেম, git describeঅন্যান্য প্রকল্পগুলি যা ব্যবহার করে, কারণ এতে মানব-পঠনযোগ্য ট্যাগ তথ্যও রয়েছে। আপনি যদি কোনও ট্যাগে ঠিক না থাকেন তবে এটি নিকটতম ট্যাগ থেকে সংক্ষেপণের সংখ্যা এবং সংক্ষিপ্ত সংশোধন হ্যাশের সাথে যুক্ত হয়।
বিডনলান

7

দুটি জিনিস যা আপনি করতে পারেন:

  • আপনি নিজের জন্য ফাইলটিতে কিছু সংস্করণ তথ্য এম্বেড করতে গিট তৈরি করতে পারেন ।

    সহজ উপায় হ'ল ident বৈশিষ্ট্য ব্যবহার করা , যার অর্থ নির্বাণ (উদাহরণস্বরূপ)

    মধ্যে .gitattributesফাইল, এবং $Id$উপযুক্ত জায়গায়। এটি স্বয়ংক্রিয়ভাবে ফাইলের সামগ্রীর (ব্লব আইডি) সনাক্তকারী SHA-1 এ প্রসারিত হবে : এটি ফাইল সংস্করণ নয়, বা শেষ প্রতিশ্রুতি।

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

  • আপনি লিনাক্স কার্নেল বা গিট নিজেই যেমন এটি করতে বিল্ড প্রক্রিয়া তৈরি করতে পারেন ।

    কটাক্ষপাত এলেবেলে-সংস্করণ-আদি স্ক্রিপ্ট এবং গীত এর ব্যবহার Makefile নামক অথবা উদাহরণস্বরূপ কিভাবে এই Makefile প্রজন্ম / কনফিগারেশন সময় সংস্করণ তথ্য এম্বেড gitweb/gitweb.cgiফাইল।

    GIT-VERSION-GEN সংস্করণ বিবরণ উত্পন্ন করতে গিট বিবরণ ব্যবহার করে। আপনার প্রকল্পটি (স্বাক্ষরিত / টীকাগুলি ট্যাগগুলি ব্যবহার করে) প্রকাশের / মাইলফলকগুলি ট্যাগ করার জন্য এটি আরও ভাল কাজ করা দরকার।


4

যখন আমি এই করতে হবে, আমি একটি ব্যবহার ট্যাগ মতো RELEASE_1_23। SHA-1 না জেনে ট্যাগটি কী হতে পারে তা আমি সিদ্ধান্ত নিতে পারি। আমি তখন ট্যাগ করতে প্রতিশ্রুতিবদ্ধ। আপনি যেভাবে যাইহোক আপনার প্রোগ্রামে সেই ট্যাগটি সংরক্ষণ করতে পারেন।


4

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

এটি পৃথক সংজ্ঞায়িত হিসাবে সংশোধন তারিখ অন্তর্ভুক্ত।


4
আমি অনুমান করি যে আপনি GIT_VERSION এবং GIT_DATE সিএফএলএজিএস এর মাধ্যমে পেরিয়ে গেছেন যাতে সংস্করণ। H সেগুলি ব্যবহার করতে পারে। কুল!
জেসি চিশলম

2

আমি আমার বৈজ্ঞানিক কোডে পরিবর্তনগুলি ট্র্যাক করতেও গিট ব্যবহার করি। আমি বাহ্যিক প্রোগ্রামটি ব্যবহার করতে চাইনি কারণ এটি কোডের বহনযোগ্যতা সীমাবদ্ধ করে (যদি কেউ এমএসভিএসে উদাহরণস্বরূপ পরিবর্তন করতে চান)।

আমার সমাধান গণনার কেবল প্রধান শাখা ব্যবহার এবং প্রাক প্রসেসর ম্যাক্রো ব্যবহার করে এটি আউটপুট বিল্ড সময় করতে যাচ্ছিলেন __DATE__এবং __TIME__। এইভাবে আমি গিট লগ দিয়ে এটি পরীক্ষা করতে এবং দেখতে পাচ্ছি যে আমি কোন সংস্করণ ব্যবহার করছি। রেফ: http://gcc.gnu.org/onlinesocs/cpp/Sandard- পূর্বনির্ধারিত- ম্যাক্রোস html

সমস্যাটি সমাধানের আর একটি মার্জিত উপায় হ'ল এক্সিকিউটেবলের মধ্যে গিট লগ অন্তর্ভুক্ত করা। গিট লগের বাইরে কোনও অবজেক্ট ফাইল তৈরি করে কোডে অন্তর্ভুক্ত করুন। এবার আপনি কেবলমাত্র বহিরাগত প্রোগ্রামটি ব্যবহার করছেন সেটি হ'ল অ্যাজবকপি তবে কম কোডিং রয়েছে। রেফ: http : //www.linuxj Journal.com/content/e এম্বেডিং-file-executable-aka-hello-world-version- 5967 এবং একটি সি ++ প্রোগ্রামে ডেটা এম্বেড


4
প্রিপ্রসেসর ম্যাক্রোগুলির ব্যবহার খুব চালাক! ধন্যবাদ.
অ্যান্ডি

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

2

আপনার যা করার দরকার তা হ'ল একটি হেডার ফাইল তৈরি করা (উদাহরণস্বরূপ সেমিডি লাইন থেকে প্রতিধ্বনি ব্যবহার করে):

এটি তৈরি করতে এ জাতীয় কিছু ব্যবহার করুন:

এটিকে সংকলন করার জন্য উদ্ধৃতি এবং ব্যাকস্ল্যাশগুলির সাথে কিছুটা খেলতে হবে তবে আপনি ধারণাটি পাবেন।


কেবল ভাবছি, প্রতিবার সে কি করে না এবং সেইজন্য ফাইল।
জোর্জে ইস্রায়েল পেঁয়া

@ ব্ল্যাঙ্ক .. আমি যা ভাবছিলাম তাও স্থির করে দেয়। কিন্তু রানডটাইমে প্রোগ্রামটি জিজ্ঞাসা করার বিডনলানের ধারণা এই সমস্যাটি প্রায় পেয়েছে বলে মনে হচ্ছে।
অ্যান্ডি

6
ঠিক আছে, এই ফাইলটি .gitignore এর অধীনে থাকতে হবে এবং আপনি যখনই প্রকল্পটি তৈরি করবেন প্রতিবার তৈরি করা উচিত।
ইগর জিভাকা

বিকল্পভাবে আপনি এই ফাইলের একটি প্রাথমিক সংস্করণ অন্তর্ভুক্ত করতে পারেন এবং --assume-unchangedএটিতে পতাকা সেট করতে পারেন ( git update-index --assume-unchanged)
ইগর জিভাকা

2

এটি সিএমকে প্রকল্পের জন্য একটি সমাধান যা উইন্ডোজ এবং লিনাক্সের জন্য কাজ করে, অন্য কোনও প্রোগ্রাম (যেমন স্ক্রিপ্ট ভাষা) ইনস্টল করার প্রয়োজন ছাড়াই works

একটি স্ক্রিপ্ট দ্বারা গিট হ্যাশ একটি .h ফাইলে লেখা হয়েছে, যা লিনাক্সে উইন্ডোজ সংকলন করার সময় বা উইন্ডোজ ব্যাচ স্ক্রিপ্ট করার সময় একটি বাশ স্ক্রিপ্ট, এবং সিএমকেলিস্ট.টেক্সটে একটি ইফ-ক্লজ প্ল্যাটফর্মের সাথে সম্পর্কিত স্ক্রিপ্টটিকে চিত্রিত করে কোড সংকলন করা হয়।

নিম্নলিখিত 2 টি স্ক্রিপ্ট সিএমকেলিস্ট.টেক্সট হিসাবে একই ডিরেক্টরিতে সংরক্ষিত হয়েছে:

get_git_hash.sh:

get_git_hash.cmd:

সিএমকেলিস্টস টেক্সট এ ফলোউইং লাইন যুক্ত করা হয়েছে

কোডটিতে উত্পন্ন ফাইলটি অন্তর্ভুক্ত করা হয় #include <my_project/githash.h>এবং গিট হ্যাশ টার্মিনালে মুদ্রণ করা যায় std::cout << "Software version: " << kGitHash << std::endl;, বা একই রকম ফ্যাশনে একটি ইয়ামল (বা কোনও) ফাইলে লেখা যায়।


1

তবুও মেকফিল এবং শেলের উপর ভিত্তি করে আরেকটি প্রকরণ

ফাইল git_commit_filename.h শেষ হবে স্ট্যাটিক কনস্ট চর * জিআইT_COMMIT_SHA = "" সমেত একক লাইন দিয়ে;

Https://gist.github.com/larytet/898ec8814dd6b3ceee65532a9916d406 থেকে


0

আপনি বুঝতে পারেন যে আমি এটির মূল প্রতিশ্রুতিতে মেমক্যাচের জন্য কী করেছিলাম ।

মূলত, মাঝেমধ্যে ট্যাগ করুন এবং নিশ্চিত করুন যে আপনি বিতরণ করেছেন তা কোথা থেকে এসেছে make distবা অনুরূপ।

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