2008-09-02 8 views
34

गिट प्रलेखन के माध्यम से ब्राउज़ करना, मैं एसवीएन के प्रतिबद्ध हुक या "प्रोपसेट" सुविधाओं के समान कुछ भी नहीं देख सकता जो कि किसी भी संस्करण में संस्करण संख्या या कॉपीराइट नोटिस को अद्यतन कर सकता है जब भी यह भंडार के लिए प्रतिबद्ध होता है।क्या गिट में 'svn propset svn: keyword` या pre-/post-commit हुक जैसे कुछ भी है?

क्या गिट उपयोगकर्ताओं को इस प्रकार की कार्यक्षमता के लिए बाहरी स्क्रिप्ट लिखने की उम्मीद है (जो प्रश्न से बाहर नहीं दिखती हैं) या क्या मैंने अभी कुछ स्पष्ट याद किया है?

संपादित: बस स्पष्ट होना, मैं में दिलचस्पी रहा हूँ, जैसे,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx 

, जहां इस तरह की स्ट्रिंग:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $ 

अप करने की तारीख के साथ रखा जाता है जब भी कोई प्रतिबद्धता होती है तो प्रासंगिक जानकारी।

उत्तर

14

Git FAQ से हवाला देते हुए:

Git कीवर्ड विस्तार है?

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

यदि आप वास्तव में ऐसा करना चाहते हैं तो gitattributes (5) देखें। यदि आपका अनुवाद रिवर्सिबल नहीं है (उदाहरण के लिए एससीसीएस कीवर्ड विस्तार) यह समस्याग्रस्त हो सकता है।

+5

मैं इस कि Git परियोजनाओं के साथ काफी अच्छी तरह से काम करता है पाया है है : //github.com/turon/git-rcs-keywords – Mark

+0

@PA अगर नि: शुल्क उत्तर आपको अनुरूप नहीं करता है, तो कृपया इसे अनदेखा करें। यहां दिए गए लिंक से, बेहतर स्पष्टीकरण ढूंढना काफी आसान है। शिकायत भी आपको ज्ञान हासिल करने में मदद नहीं करती है। और इसे गिट कहा जाता है, जीआईटी नहीं। –

+1

गिट एफएक्यू के सूचक के लिए धन्यवाद। मुझे यह उद्धरण मनोरंजक मिला: "कीवर्ड विस्तार ... वैसे भी वास्तव में उपयोगी नहीं है।" एक समर्थन डेवलपर के रूप में, मैं प्रतिदिन स्रोत कोड विशेषताओं का संदर्भ देता हूं। उदाहरण के लिए, हमारे डेटाबेस संग्रहीत प्रक्रिया शीर्ष पर संशोधन गुणों के साथ स्रोत नियंत्रण में हैं। डेटाबेस में संग्रहीत प्रक्रिया का कौन सा संस्करण स्थापित किया गया है, यह सत्यापित करने के लिए मैं एक संशोधन विशेषता का उपयोग कर सकता हूं। –

2

शायद सबसे आम एसवीएन संपत्ति, 'svn: ignore' मेटाडेटा की बजाय .gitignore फ़ाइल के माध्यम से की जाती है। मुझे डर है कि मेरे पास अन्य प्रकार के मेटाडेटा के लिए और भी उपयोगी नहीं है।

4

गिट में पूर्व-प्रतिबद्धता और पोस्ट-प्रतिबद्ध हुक हैं, वे प्रत्येक .git/hooks निर्देशिका के अंदर स्थित हैं। फ़ाइलों को बस संशोधित करें और उन्हें निष्पादन योग्य बनाने के लिए उन्हें chmod।

18

मैंने इस जगह पर fairly complete answer लिखा, कोड दिखाता है कि यह कैसे करें। सारांश:

  1. शायद आप ऐसा नहीं करना चाहते हैं। git describe का उपयोग करना एक उचित विकल्प है।
  2. यदि आपको ऐसा करने की आवश्यकता है, तो $Id$ और $Format$ काफी आसान हैं।
  3. कुछ भी उन्नत के लिए gitattributes और एक कस्टम फ़िल्टर का उपयोग करने की आवश्यकता होगी। मैं $Date$ का एक उदाहरण कार्यान्वयन प्रदान करता हूं।

हुक फ़ंक्शंस के आधार पर समाधान आमतौर पर सहायक नहीं होते हैं, क्योंकि वे आपकी कार्यशील प्रति गंदे बनाते हैं।

1

हालांकि एक पुराना क्यू & ए। मैंने सोचा कि मैं एक में फेंक दूंगा क्योंकि यह मुझे लंबे समय तक चिपका रहा है।

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

गिट मेरी योजनाओं को गड़बड़ कर देगा क्योंकि जब शाखा बदलती है तो स्थानीय रेपो पैक किए गए स्थानीय रेपो में बैठे (वृद्धिशील ... मुझे पता है) की प्रतिलिपि वाली फ़ाइलों को पूरी तरह से ओवरराइट कर देगा।

इस तरह से चेक की गई सभी फाइलों में चेकआउट का समय टिकट होगा और उनका अंतिम संशोधन समय प्रतिबिंबित नहीं होगा ..... कितना परेशान है। अंतिम संशोधन आईटी क्या फाइल सिस्टम ऐसी है कि मैं एक होगा पर किया गया है अनुसार समय के साथ किसी भी फाइल अंदर $ संपत्ति:

तो, मैं पार्टी में एक एक लाइनर कि एक $ तिथि अपडेट करेगा तैयार कर लिया है git log, git show या दोष मोड में प्रतिबद्ध समय देने के बिना अंतिम संशोधन की तत्काल स्थिति बताएं।

निम्न प्रक्रिया $ तारीख: $ कीवर्ड को केवल ट्रैक की गई फ़ाइलों में संशोधित करेगी जो रेपो के लिए प्रतिबद्ध होने जा रही हैं। यह git diff --name-only का उपयोग करता है जो संशोधित फ़ाइलों को सूचीबद्ध करेगा, और कुछ भी नहीं ....

मैं कोड करने से पहले मैन्युअल रूप से इस एक-लाइनर का उपयोग करता हूं। हालांकि एक बात यह है कि मुझे इसे लागू करने से पहले रेपो की मूल निर्देशिका में नेविगेट करना होगा। https:

यहाँ लिनक्स के लिए कोड संस्करण (पठनीयता के लिए एक बहु पंक्ति के रूप में चिपकाया)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \ 
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \ 
    set -- $l; f=$1; shift; d=$*; modif=`date -d "@$d"`; \ 
    perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \ 
    git add $f; done 

और OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \ 
    set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \ 
    perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \ 
    git add $f; done 
संबंधित मुद्दे