CVS से Git में जाना: $ Id $ समकक्ष?


124

मैं सरल स्रोत कोड नियंत्रण उपकरण के बारे में पूछने वाले सवालों के एक समूह के माध्यम से पढ़ा और Git एक उचित विकल्प की तरह लग रहा था। मेरे पास यह है और चल रहा है, और यह अब तक अच्छा काम करता है। एक पहलू जो मुझे सीवीएस के बारे में पसंद है वह एक संस्करण संख्या का स्वत: वृद्धि है।

मैं समझता हूं कि यह एक वितरित भंडार में कम समझ में आता है, लेकिन एक डेवलपर के रूप में, मुझे ऐसा कुछ चाहिए / चाहिए। मुझे समझाने की वजह से:

मैं Emacs का उपयोग करता हूं। समय-समय पर मैं तीसरे पक्ष के पैकेज के लिए लिस्प स्रोत फ़ाइलों के नए संस्करणों को देखता हूं। मान लें कि मुझे एक फ़ाइल मिली है, foo.el, जो हेडर के अनुसार, संस्करण 1.3 है; अगर मैं नवीनतम संस्करण देखता हूं और यह 1.143 या 2.6 या जो भी हो, मुझे पता है कि मैं बहुत पीछे हूं।

यदि इसके बजाय मुझे 40-चरित्र वाली राख के एक जोड़े को देखते हैं, तो मुझे नहीं पता होगा कि कौन सा बाद में है या किसी भी विचार को बाद में पता चलता है कि यह कितना बाद है। मैं इसे पूरी तरह से नफरत करूंगा अगर मुझे मैन्युअल रूप से ChangeLogs की जांच करनी है, तो मुझे यह पता लगाने के लिए कि मैं कितना पुराना हूं।

एक डेवलपर के रूप में, मैं इस शिष्टाचार का विस्तार करना चाहता हूं, जैसा कि मैं इसे देखता हूं, मेरे आउटपुट का उपयोग करने वाले लोगों को (और शायद मैं खुद को मजाक कर रहा हूं कि कोई भी है, लेकिन चलो एक पल के लिए इसे छोड़ दें)। मैं हर बार खुद को लानत संख्या बढ़ाने के लिए याद रखना नहीं चाहता, या टाइमस्टैम्प या ऐसा कुछ। यह एक वास्तविक पीटीए है, और मुझे पता है कि अनुभव से।

तो मेरे पास क्या विकल्प हैं? अगर मुझे $ Id नहीं मिलती: $ समकक्ष, मैं और क्या प्रदान कर सकता हूँ जो मैं देख रहा हूँ?

मुझे यह उल्लेख करना चाहिए कि मेरी अपेक्षा यह है कि अंतिम उपयोगकर्ता के पास Git स्थापित नहीं होगा और यहां तक ​​कि अगर वे करते हैं, तो एक स्थानीय भंडार नहीं होगा (वास्तव में, मुझे उम्मीद है कि इसे उस तरह से उपलब्ध नहीं किया जाएगा)।

जवाबों:


67

SHA एक संस्करण (यद्यपि विहित) का केवल एक प्रतिनिधित्व है। git describeआदेश दूसरों प्रदान करता है और इसलिए बहुत अच्छी तरह से करता है।

उदाहरण के लिए, जब मैं git describeअपने जावा के ग्राहक शाखा के मास्टर शाखा में चलता हूं, तो मुझे यह मिलता है:

2.2-16-gc0cd61a

यह दो महत्वपूर्ण बातें कहती हैं:

  1. 2.2 से इस पेड़ में वास्तव में 16 कमिट हैं
  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है।
लेमीक

राइट-अप केवल जानकारी सीखने का वर्णन करता है, न कि आपके निष्पादन योग्य में एम्बेड करने का। इसके लिए git describeआपको निर्माण करने से ठीक पहले कमांड को चलाने की आवश्यकता है , आउटपुट को हेडर फ़ाइल में सहेजें, या अन्यथा अपने कोड में मान एम्बेड करें।
जेसी चिशोल्म

55

अब तक Git में $ Id: $ का समर्थन है। फ़ाइल README के लिए इसे सक्षम करने के लिए आप "README पहचान" को .ITITributes में डालेंगे । फ़ाइल नामों पर वाइल्डकार्ड समर्थित हैं। देखें आदमी gitattributes जानकारी के लिए।


14
यह आपको बूँद के sha1 देता है, लेकिन प्रतिबद्ध के sha1 को नहीं। उपयोगी, सिर्फ प्रतिबद्ध के लिए एक पहचानकर्ता के रूप में नहीं।
स्टीफन जेनिंग्स

4
git में $Id$उल्लेख की तरह कोई कीवर्ड विस्तार तंत्र नहीं है । जो कुछ दूर है वह वही है जो आपको मिलता है। किसी भी स्थिति में, संस्करण उन फाइलों के पूर्ण संग्रह से संबंधित है, जो विशेष रूप से एक फ़ाइल के लिए नहीं हैं (यह विचार आरसीएस दिनों का एक अवशेष है, या शायद एससीसीएस को यहाँ दोष देना है ... जैसा कि सीवीएस सिर्फ एक है RCS को महिमामंडित किया गया है, और SVN एक CVS-वर्कलिक बनने की कोशिश करता है, यह अटक गया है।)।
वॉनब्रांड

32

यह ओपी से अनुचित अनुरोध नहीं है।

मेरा उपयोग मामला है:

  1. मैं अपने निजी कोड के लिए Git का उपयोग करता हूं, इसलिए दूसरों के साथ कोई सहयोग नहीं करता।
  2. मैं सिस्टम बैश स्क्रिप्ट को वहां रखता हूं जो /usr/local/binतैयार होने पर उसमें जा सकती है ।

मैं उस पर एक ही गिट रिपॉजिटरी के साथ तीन अलग-अलग मशीनों का उपयोग करता हूं। यह जानना अच्छा होगा कि वर्तमान में मेरे पास मौजूद /usr/local/bin"डिफ्यू-डि <रेपो वर्जन> <संस्करण / in / usr / लोकल / बिन>" को करने के बिना मेरे पास मौजूद फाइल का "संस्करण" क्या है ।

आप में से नकारात्मक होने के लिए, याद रखें कि वहाँ अन्य उपयोग के मामले हैं। हर कोई Git रिपॉजिटरी में फाइलों के साथ सहयोगी कार्य के लिए Git का उपयोग "अंतिम" स्थान पर नहीं करता है।

वैसे भी, मैंने इसे जिस तरह से रिपॉजिटरी में एक विशेषता फ़ाइल बनाने के लिए किया था:

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

फिर $ Id $ को फ़ाइल में कहीं रख दें (मुझे उसे शेबंग के बाद रखना पसंद है)।

प्रतिबद्ध है। ध्यान दें कि यह अपने आप विस्तार नहीं करता है जैसे कि मुझे उम्मीद थी। आपको फ़ाइल को फिर से सह करना होगा, उदाहरण के लिए,

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

और फिर आप विस्तार देखेंगे, उदाहरण के लिए:

$ head foo.sh
#!/bin/sh

# $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

कुछ अच्छी जानकारी यह है कि मैं Git रिपॉजिटरी के लिए पहचान स्ट्रिंग को कैसे सक्षम करूं?


3
यह ध्यान दिया जाना चाहिए कि यह वर्तमान फ़ाइल की पहचान करता है (बूँद), वर्तमान प्रतिबद्ध नहीं
चार्ल्स 22 नवंबर'13 को 13:57

3
क्या करना git coचाहिए? मुझे त्रुटि संदेश मिला " git: 'co' is not a git command. See 'git --help'." क्या यह होना चाहिएgit checkout ?
पीटर मोर्टेंसन

23

यकीन नहीं होगा कि यह कभी जीट में होगा। लिनस को उद्धृत करने के लिए :

"कीवर्ड प्रतिस्थापन की पूरी धारणा बस पूरी तरह से मूर्खतापूर्ण है। यह वास्तविक सामग्री ट्रैकिंग के" बाहर "करने के लिए तुच्छ है, यदि आप इसे चाहते हैं कि जब यह टार-बॉल्स आदि के रूप में पेड़ों को मुक्त कर दे।"

लॉग की जांच करना बहुत आसान है, हालांकि - यदि आप foo.el की स्थिर शाखा पर नज़र रख रहे हैं, तो आप देख सकते हैं कि स्थिर शाखा के लॉग में कौन से नए आवागमन हैं जो आपकी स्थानीय प्रतिलिपि में नहीं हैं। यदि आप सीवीएस के आंतरिक संस्करण संख्या का अनुकरण करना चाहते हैं, तो आप अंतिम प्रतिबद्ध के टाइमस्टैम्प की तुलना कर सकते हैं।

संपादित करें: आपको इसके लिए किसी और की स्क्रिप्ट लिखना या उपयोग करना चाहिए, ज़ाहिर है, मैन्युअल रूप से ऐसा न करें।


26
हाँ, मैं कीवर्ड विस्तार के बारे में ईमेल के उस लंबे स्ट्रिंग का हिस्सा पढ़ता हूं। लाइनस का रवैया मुझे पूरी तरह से बंद करने के लिए काफी था।
जो कैसडोनेट

15
हाँ, कभी-कभी उनमें विनम्रता की कमी होती है, लेकिन वह आमतौर पर सही होते हैं, और वह निश्चित रूप से कीवर्ड विस्तार के विषय पर है।
बॉम्बे

संस्करण ट्रैकिंग आवश्यक है। शुद्ध विकास के अलावा अन्य बुनियादी ढांचे में git का उपयोग किया जाता है जहां कोई यह निर्धारित करने के लिए कोड पढ़ सकता है कि क्या यह समझ में आता है। लेकिन जब मनमाने कंटेंट वाली फाइलों को ट्रैक करने के लिए रिविजन कंट्रोल सिस्टम का इस्तेमाल किया जाता है तो आपके पास आधिकारिक रिलीज जानने के कुछ साधन होने चाहिए। git, चलो अकेले git लॉग मशीन पर नहीं है जो .ini, .conf, .html और अन्य फ़ाइलों को धकेल दिया गया।
rjt

7
लीनस ने खोजशब्द विस्तार के केवल एक पहलू पर टिप्पणी की - रिलीज़ ट्रैकिंग। लेकिन यह इसका एकमात्र उद्देश्य नहीं है। वह उद्धरण स्पष्ट रूप से एक आदमी के रवैये को दर्शाता है, लेकिन कहते हैं कि विषय के बारे में कुछ भी उपयोगी नहीं है। एक विशिष्ट "एक अतिरंजित तरीके से स्पष्ट राज्य" राजनीतिक चाल, और भीड़ तुम्हारी है। समस्या यह है कि परिभाषा के आधार पर भीड़ मूर्ख है, क्योंकि इसके पास केवल एक ही मस्तिष्क है। जो स्पष्ट रूप से गिट और कीवर्ड विस्तार के साथ स्थिति की व्याख्या करता है। एक बेवकूफ ने कहा "नहीं" और सभी ने खुश किया!
अरडमैन

1
@ArrDaemon इतना ही नहीं, विशेषता के $Id$माध्यम से जोड़ा गया समर्थन के बाद से ident, जैसा कि यहां एक अन्य जवाब में उल्लेख किया गया है, यह दिखाते हुए कि यहां तक ​​कि खुद भी लिनस की राय के लिए बंधक नहीं है।

21

जैसा कि मैंने लिखा है से पहले :

स्वचालित रूप से उत्पन्न आईडी टैग जो एक समझदार संस्करण संख्या दिखाते हैं, बाज़ार जैसे DSCM टूल के साथ करना असंभव है क्योंकि हर किसी की विकास की रेखा अन्य सभी से अलग हो सकती है। तो कोई व्यक्ति किसी फ़ाइल के संस्करण "1.41" को संदर्भित कर सकता है, लेकिन उस फ़ाइल का "संस्करण" 1.41 अलग है।

मूल रूप से, $ Id $ Bazaar, Git और अन्य वितरित स्रोत कोड प्रबंधन टूल के साथ कोई मतलब नहीं है।


6
ठीक है, मैंने पढ़ा है कि पोस्ट करने से पहले, और इसीलिए मैंने अंतर्निहित समस्या का अधिक सामान्य समाधान करने के लिए कहा। मुझे लगता है कि एक व्यक्तिगत फ़ाइल के लिए एक संस्करण # की इच्छा वैध है, क्योंकि एक समाधान प्रदान करने में असमर्थता है।
जो Casadonte

यह Git की अक्षमता नहीं है, यह सभी वितरित SCM की अक्षमता है। यदि आप वास्तव में सार्थक संस्करण संख्याएँ चाहते हैं, तो सबवर्सन, या सीवीएस, या कुछ अन्य केंद्रीकृत प्रणाली का उपयोग करें।
बॉम्बे

7
"संस्करण संख्या" के बजाय केवल हैश बाहर थूकने में क्या गलत है? मुझे लॉग स्टेटमेंट चाहिए, वेब स्क्रिप्ट्स पर डिबग और "--version" विकल्प, जो आसानी से बता देगा कि रिवीजन कहां चल रहा है, इसलिए मैं उस विशिष्ट हैश की जांच कर सकता हूं और देख सकता हूं कि यह किस तरह का व्यवहार कर रहा है। यह तैनात किए गए ऐप्स के प्रबंधन को सरल करता है .... और मुझे कुछ कमिट हुक नहीं चाहिए जो हर कमिट को हर उस फ़ाइल में बदलाव मानता है, जिसमें $ Id $ टैग था।
nairbv

1
फ़ाइल का हैश जिस पर आप काम कर रहे हैं, वह "संस्करण" के समान काम करेगा, जब तक आप इसे उस आईडी के अनुसार देख सकते हैं
एरिक एरोनिटी

2
@Brian - ओपी के संपादन के अनुसार, अंतिम उपयोगकर्ता संस्करण संख्या जानना चाहता है लेकिन उसके पास git या git लॉग की पहुँच नहीं है। इस मामले में, हैश एक अर्थहीन संख्या है, न कि संस्करण संख्या। एक DSCM इस जरूरत को हल करने में कोई सहायता नहीं देता है।
जेसी चिशोल्म

10

मुझे भी यही समस्या थी। मुझे एक संस्करण की आवश्यकता थी जो हैश स्ट्रिंग की तुलना में सरल था और रिपॉजिटरी से कनेक्ट करने की आवश्यकता के बिना टूल का उपयोग करने वाले लोगों के लिए उपलब्ध था।

मैंने इसे Git के प्री-कमिट हुक के साथ किया और अपनी स्क्रिप्ट को बदलकर खुद को अपडेट करने में सक्षम होने के लिए किया।

मैं किए गए कमिट की संख्या का संस्करण बंद कर देता हूं। यह एक मामूली दौड़ की स्थिति है क्योंकि दो लोग एक ही समय में प्रतिबद्ध हो सकते हैं और दोनों को लगता है कि वे एक ही संस्करण संख्या में प्रतिबद्ध हैं, लेकिन हमारे पास इस परियोजना पर कई डेवलपर्स नहीं हैं।

एक उदाहरण के रूप में, मेरे पास एक स्क्रिप्ट है जिसे मैं चेक करता हूं जो रूबी में है, और मैं इस कोड को इसमें जोड़ता हूं - यह बहुत सरल कोड है इसलिए यदि आप किसी अलग भाषा में किसी चीज़ की जाँच कर रहे हैं तो यह अलग-अलग भाषाओं में पोर्ट करना आसान है (हालांकि स्पष्ट रूप से यह आसानी से नॉन-रननेबल चेकइन जैसे टेक्स्ट फाइल) के साथ काम नहीं करेगा। मैंने जोड़ लिया है:

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) जोड़ता हूं इसलिए अगर मैं इसे "टूल -updateVersion" कहता हूं तो यह सिर्फ उस टूल के लिए अपडेटवर्जन कहता है जो अपने आप में "MYVERSION" मान को संशोधित करता है और फिर बाहर निकलता है (आप कर सकते थे) क्या यह अन्य फ़ाइलों को भी अद्यतन करता है यदि वे खुले हैं यदि आप चाहते हैं)।

एक बार सेटअप होने के बाद, मैं Git के सिर पर जाता हूं और एक निष्पादन योग्य एक लाइन बैश स्क्रिप्ट बनाता हूं .git/hooks/pre-commit

स्क्रिप्ट बस Git डायरेक्टरी के हेड में बदल जाती है और मेरी स्क्रिप्ट को कॉल करती है -updateVersion

हर बार जब मैं प्री-कमिट स्क्रिप्ट में जांच करता हूं तो रन होता है जो मेरी स्क्रिप्ट को -updateVersion से चलाता है, और फिर MYVERSION वैरिएबल को अपडेट किया जाता है कि कमिट की संख्या क्या होगी। जादू!


तो क्या आपके रूबी लिपि को अद्यतन करने के लिए कहा जाना चाहिए git updateVersion? कृपया इसे कैसे कहा जाता है के कुछ नमूने डालें।
rjt

मैं उस स्क्रिप्ट के लिए एक विकल्प (-updateVersion) बनाता हूं जिसे मैं चेक कर रहा हूं जो 'updateVersion' फ़ंक्शन को कॉल करता है (इस मामले में मैं स्क्रिप्ट में संस्करण संख्या को बदलने की कोशिश कर रहा हूं)। तब मैं बस एक ऑनलाइनर शेल कमांड बनाता हूं जो मेरी स्क्रिप्ट को -updateVersion के साथ कॉल करता है, और फिर यह हर चेकइन से पहले खुद को अपडेट करता है।
डेविड लैजंग मैडिसन स्टेलर

8

यदि आपके लिए $ कीवर्ड $ आवश्यक है, तो हो सकता है कि आप इसके बजाय Mercurial को देखने का प्रयास कर सकें ? इसमें एक hgkeyword एक्सटेंशन है जो आप जो चाहते हैं उसे लागू करते हैं। Mercurial वैसे भी एक DVCS के रूप में दिलचस्प है।


8

कुछ जो गिट रिपॉजिटरी के साथ किया जाता है वह tagऑब्जेक्ट का उपयोग करना है। इसका उपयोग किसी भी प्रकार के स्ट्रिंग के साथ कमिट करने के लिए किया जा सकता है और इसका उपयोग संस्करणों को चिह्नित करने के लिए किया जा सकता है। आप उस टैग को git tagकमांड के साथ एक रिपॉजिटरी में देख सकते हैं , जो सभी टैग को वापस करता है।

किसी टैग को देखना आसान है। उदाहरण के लिए, यदि कोई टैग है v1.1तो आप उस टैग को इस तरह शाखा में देख सकते हैं:

git checkout -b v1.1

जैसा कि यह एक शीर्ष स्तर की वस्तु है, आप पूरे इतिहास को उस कमिट में देखेंगे, साथ ही साथ डिफरेंसेस चलाने, बदलाव करने और मर्ज करने में सक्षम होंगे।

इतना ही नहीं, लेकिन एक टैग बनी रहती है, भले ही उस शाखा को हटा दिया गया हो, जिसे वापस मुख्य लाइन में विलय किए बिना हटा दिया गया हो।


6
क्या फिर, इस टैग को फ़ाइल में स्वचालित रूप से git द्वारा डाला जाना है? धन्यवाद!
जो कैसडोंटे

1
यदि आप खोजशब्द विस्तार से मतलब रखते हैं? वहां तक ​​तो नहीं, जहां तक ​​मुझे पता है। यदि आप उत्पादों का निर्माण कर रहे हैं, तो आप अपनी बिल्ड स्क्रिप्ट के भाग के रूप में जानकारी प्राप्त कर सकते हैं और इसे अपने निर्मित उत्पाद में कहीं डाल सकते हैं। मैन गित-वर्णन का प्रयास करें जो नवीनतम टैग, इस टैग के बाद से आने वाली संख्या और वर्तमान हैश देता है।
अबिज़र्न

हां, टैग और अन्य संबंधित जानकारी को अब 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
इसलिए, लॉग का उपयोग न करें: git Rev-list master..origin / master | wc -l
डस्टिन

4

यदि आप चाहते हैं कि लोग यह जान सकें कि वे कितने पुराने हैं, तो उन्हें कई आसान तरीकों से सूचित कर सकते हैं। वे उदाहरण के लिए अपने ट्रंक और अपने ट्रंक पर अंतिम प्रतिबद्ध की तारीखों की तुलना करते हैं। वे उपयोग कर सकते हैंgit cherry देखने के लिए हैं कि आपके ट्रंक में कितने कमिट आए हैं जो उनके में मौजूद नहीं हैं।

अगर यह सब आप के लिए चाहते हैं, मैं एक संस्करण संख्या के बिना इसे प्रदान करने के लिए एक रास्ता तलाश करेंगे।

इसके अलावा, मैं किसी से भी शिष्टाचार बढ़ाने की जहमत नहीं उठाऊँगा, जब तक कि आपको यकीन न हो कि वे चाहते हैं। :)


यदि दिनांक तुलना करने के लिए ठीक हैं, तो DateTImeStamp को फ़ाइल में डालें। git में सिर्फ डेवलपर्स की तुलना में कई अन्य उपयोग के मामले हैं। यदि वर्तमान में कार्यस्थान पर .INI या .conf फ़ाइल वर्तमान में किसी भी समस्या के निवारण के लिए सम्‍मिलित हो रही है, तो इसे जानने के लिए फ़ील्ड में IT की आवश्यकता है।
आरजेटी

क्या केवल टाइमस्टैम्प पर्याप्त होगा? गलत शाखा में एक आकर्षक टाइमस्टैम्प हो सकता है और फिर भी कम सही हो सकता है।
user2066657

4

रिपॉजिटरी में सभी उप-निर्देशिकाओं में सभी फाइलों के विस्तार को लागू करने के लिए, रिपॉजिटरी .gitattributesमें शीर्ष स्तर निर्देशिका में एक फाइल जोड़ें (यानी जहां आप सामान्य रूप से .gitignoreफाइल डालेंगे):

* ident

इसे प्रभावी रूप से देखने के लिए, आपको पहले फ़ाइल (ओं) का एक प्रभावी चेकआउट करना होगा, जैसे कि उन्हें किसी भी तरह से हटाना या संपादित करना। फिर उन्हें पुनर्स्थापित करें:

git checkout .

और आपको $Id$कुछ इस तरह से देखना चाहिए :

$Id: ea701b0bb744c90c620f315e2438bc6b764cdb87 $

से man gitattributes:

अध्यक्ष

जब विशेषता पहचान एक पथ के लिए सेट की जाती है, तो Git $ Id में $ Id को $ Id के साथ बदल देता है :, उसके बाद 40-वर्ण हेक्साडेसिमल बूँद ऑब्जेक्ट नाम, चेकआउट पर एक डॉलर चिह्न $ द्वारा पीछा किया जाता है। कोई भी बाइट अनुक्रम जो $ Id से शुरू होता है: और वर्कट्री फ़ाइल में $ के साथ समाप्त होता है, चेक-इन पर $ Id $ के साथ बदल दिया जाता है।

यह आईडी हर बार फ़ाइल के नए संस्करण के लिए प्रतिबद्ध होने पर बदल जाएगी।


3

आरसीएस आईडी एकल-फ़ाइल परियोजनाओं के लिए अच्छे हैं, लेकिन किसी भी अन्य $ $ $ के लिए परियोजना के बारे में कुछ नहीं कहता है (जब तक कि आप डमी चेक-इन को डमी संस्करण फ़ाइल के लिए मजबूर न करें)।

फिर भी किसी को रुचि हो सकती है कि प्रति फ़ाइल स्तर पर या प्रतिबद्ध स्तर पर $ Author $, $ Date $, $ Revision $, $ RCSfile $ इत्यादि के समतुल्य कैसे प्राप्त किया जाए (कैसे कुछ खोजशब्द हैं, उन्हें दूसरे में डालें) सवाल)। मेरे पास इन पर कोई जवाब नहीं है, लेकिन उन को अपडेट करने की आवश्यकता को देखते हैं, खासकर जब फाइलें (अब गिट में) आरसीएस-संगत सिस्टम (सीवीएस) से उत्पन्न हुई हैं।

इस तरह के कीवर्ड दिलचस्प हो सकते हैं यदि स्रोत किसी भी गिट रिपॉजिटरी से अलग से वितरित किए जाते हैं (यही मैं भी करता हूं)। मेरा समाधान इस तरह है:

हर प्रोजेक्ट की अपनी एक डायरेक्टरी होती है, और प्रोजेक्ट रूट में मेरे पास एक टेक्स्ट फाइल होती है, जिसका .versionकंटेंट वर्तमान वर्जन (सोर्स एक्सपोर्ट करते समय इस्तेमाल होने वाला नाम) बताता है।

अगली रिलीज़ के लिए काम करते समय एक स्क्रिप्ट उस .versionनंबर को निकालती है , कुछ Git वर्जन डिस्क्रिप्टर (जैसे git describe) और एक मोनोटोनिक बिल्ड नंबर .build(प्लस होस्ट और डेट) एक ऑटो-जेनरेटेड सोर्स फाइल में होता है जो फाइनल प्रोग्राम से जुड़ा होता है, ताकि आप पा सकें किस स्रोत से और कब बनाया गया था।

मैं अलग-अलग शाखाओं में नई सुविधाओं का विकास करता हूं, और पहली चीज जो मैं करता हूं n( .versionस्ट्रिंग के लिए "अगला") जोड़ रहा हूं (एक ही रूट से उत्पन्न कई शाखाएं एक ही अस्थायी .versionसंख्या का उपयोग करेंगी )। विमोचन से पहले मैं तय करता हूं कि किन शाखाओं को विलय करना है (उम्मीद है कि सभी समान हैं .version)। मर्ज करने से पहले, मैं .versionअगले नंबर (प्रमुख या मामूली अद्यतन, मर्ज किए गए सुविधाओं के आधार पर) पर अपडेट करता हूं ।


3

यदि आप चाहते हैं कि git आपके कोड में जानकारी को सुलभ बनाए , तो आपको इसे प्राप्त करने के लिए एक पूर्व-निर्मित चरण करना होगा। C / C ++ के लिए bash में यह कुछ इस तरह दिख सकता है:

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कमियां हैं:

  • एक recompile मजबूर 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

जब से आप Emacs का उपयोग करते हैं, आप भाग्यशाली हो सकते हैं :)

मैं संयोग से इस सवाल पर आया हूं, और संयोग से मैं कुछ दिनों पहले जीवंत रूप से आया हूं , एक एमएसीएस पैकेज जो आपके दस्तावेज़ में एमएसीएस लिस्प के जीवंत टुकड़े होने की अनुमति देता है। मैंने इसे ईमानदार बनाने की कोशिश नहीं की है, लेकिन यह पढ़ते समय मेरे दिमाग में आया।


0

मैं SCCS, RCS, और CVS ( %W% %G% %U%) से भी आया था ।

मेरे पास भी ऐसी ही चुनौती थी। मैं यह जानना चाहता था कि किसी भी सिस्टम को चलाने वाला कोड किस संस्करण पर है। सिस्टम किसी भी नेटवर्क से जुड़ा हो सकता है या नहीं भी। सिस्टम में Git इंस्टॉल हो भी सकता है और नहीं भी। सिस्टम के पास GitHub रिपॉजिटरी हो सकती है या नहीं।

मैं कई प्रकार के कोड (.sh, .go, .yml, .xml, आदि) के लिए एक ही समाधान चाहता था। मैं चाहता था कि कोई भी व्यक्ति Git या GitHub के ज्ञान के बिना इस सवाल का जवाब देने में सक्षम हो कि "आप किस संस्करण में चल रहे हैं?"

इसलिए, मैंने लिखा कि मैं कुछ गिफ्ट कमांड के आसपास एक रैपर को क्या कहता हूं। मैं इसका उपयोग संस्करण संख्या और कुछ जानकारी के साथ एक फ़ाइल को चिह्नित करने के लिए करता हूं। यह मेरी चुनौती को हल करता है। यह आपकी मदद कर सकता है।

https://github.com/BradleyA/markit

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.