2011-04-03 15 views
10

मैं एक के बाद प्राप्त दूरस्थ रेपो मुझे लगता है कि करने के लिए जोर दे रहा हूँ एक git reset --hardGit धक्का पर हार्ड रीसेट

कुछ इस तरह है पर बैठे हुक स्क्रिप्ट:

$ git push opal 
Counting objects: 74, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (45/45), done. 
Writing objects: 100% (53/53), 16.68 KiB, done. 
Total 53 (delta 20), reused 0 (delta 0) 
remote: warning: updating the current branch 
remote: HEAD is now at 88f1e35 tweak lavalamp styles 

मैं क्या समझ में नहीं आता यहां है - रिमोट का कहना है कि सिर अब XXX पर है, लेकिन जब मैं सर्वर में लॉग इन करता हूं - रिमोट वर्किंग कॉपी बिल्कुल अपडेट नहीं होती है!

कोई विचार?

+0

आपको इसके साथ समस्या होने पर वास्तव में अपनी हुक स्क्रिप्ट पोस्ट करनी चाहिए। –

+0

क्रिस, मेरी पोस्ट-प्राप्त स्क्रिप्ट में केवल उस पंक्ति में शामिल है। पोस्ट करने की कोई जरूरत नहीं है। – David

उत्तर

0

वैसे स्क्रिप्ट शायद नहीं चलती है। यह गूंगा http सर्वर पर नहीं चलेगा। यह एसएसएच पर चलाएगा। मुझे स्मार्ट http सर्वर के साथ यकीन नहीं है।

यदि ऐसा नहीं है, तो आपको हुक (chmod + x .git/hooks/post-rece) पर 'execute' permisssion की जांच करनी चाहिए। जब आप इसमें हों, आम तौर पर ओवेनशिप और अनुमतियों की जांच करें।

यदि यह ठीक लगता है, तो बस स्क्रिप्ट में पहली पंक्ति के रूप में लॉगस्टेटमेंट शामिल करें (उदा। date "%T $0 executed" >> /tmp/debug_hook.log) और यह देखने के लिए लॉगफाइल जांचें कि कुछ भी अपडेट हो गया है या नहीं।

इसके अलावा, पर धक्का के लिए संभव है, वास्तव में कुछ भी करें (सब कुछ अद्यतित)। उस स्थिति में, यह समझ में आता है कि हुक को

यदि यह सब संकेत नहीं देता है, तो कृपया .git/config पोस्ट करें क्योंकि यह सर्वर (या कम से कम भाग) पर रहता है। क्या git log -1 HEAD सर्वर पर अपेक्षित परिणाम देते हैं? क्या आपकी हुक स्क्रिप्ट में कुछ भी शामिल है जो GIT_DIR, GIT_WORK_TREE या GIT_INDEX_FILE को ओवरराइड कर सकता है?

+0

'हेड अब है ...' संदेश केवल 'गिट चेकआउट' या 'गिट रीसेट' से आने की संभावना है। न तो एक सामान्य धक्का का हिस्सा हैं, इसलिए हुक स्क्रिप्ट लगभग निश्चित रूप से चल रही है। –

+0

क्या आपने कोई अन्य चेक किया है? खासकर सिर की जांच? दूसरी पोस्ट पढ़ना, आपको 'GIT_DIR' चेक पर सकारात्मक परिणाम होना होगा ... – sehe

22

समस्या यह है कि कैसे गिट कमांड आपके सामान्य वातावरण बनाम हुक स्क्रिप्ट के लिए बनाए गए पर्यावरण में व्यवहार करते हैं।

सबसे पहले, हुक स्क्रिप्ट्स अपनी वर्तमान कार्य निर्देशिका के साथ गिट निर्देशिका में सेट की गई हैं (यानी .git/ गैर-नंगे भंडार की निर्देशिका)। दूसरा, GIT_DIR पर्यावरण चर सेट के साथ चलने वाली हुक स्क्रिप्ट और गिट रिपोजिटरी को इंगित करने (फिर से, .git/ गैर-नंगे भंडार की निर्देशिका)।

आम तौर पर, यदि आप .git/ निर्देशिका से git reset --hard चलाने का प्रयास है, यह निम्न संदेश के साथ मर जाएगा:

fatal: This operation must be run in a work tree 

लेकिन जब GIT_DIR सेट किया गया है, Git आदेशों को लगता है कि वर्तमान निर्देशिका काम कर पेड़ है। वर्तमान निर्देशिका के बाद से जब हुक रन .git/ निर्देशिका है, तो आपकी git reset --hard वास्तव में आपकी वर्किंग निर्देशिका के बजाय .git/ में आपकी कार्यरत पेड़ फ़ाइलों को "जांच" कर रही है (यानी अब आपके पास अपनी .git/ निर्देशिका में आपकी संस्करण की सामग्री की एक प्रति है)।

उम्मीद है कि आपके भंडार में संस्करणित सामग्री में से कोई भी पथनाम नहीं है जो pathnames that Git uses in Git repositories themselves के साथ मेल खाता है। यदि वे मेल खाते हैं, तो आपके git reset --hard ने आपके भंडार की आंतरिक संरचना को कुछ लिखा होगा और आप शायद इसे किसी अन्य भंडार से फिर से क्लोन करना चाहेंगे।

# make a backup of your repository first! 
(cd .git && GIT_DIR=$PWD git ls-files -cz | xargs -0 rm) 

यह केवल वर्तमान में ट्रैक फ़ाइलों को हटा दें (इसके पीछे है फ़ाइलें छोड़ देंगे होगा: यदि आपको विश्वास है Git के आंतरिक pathnames साथ संस्करणीकृत सामग्री संघर्ष में से कोई भी है, तो आप इसे साफ करने के लिए इस के साथ सक्षम हो सकता है कि कर रहे हैं चूंकि हटा दिया गया था, लेकिन एक बार टिप में ट्रैक किया गया था जबकि टूटा हुआ हुक सक्रिय था)।


एक समाधान बुला Git आदेश से पहले सामान्य काम पेड़ और सेट नहीं GIT_DIR और GIT_WORK_TREE करने के लिए वर्तमान कार्यशील निर्देशिका को बदलने के लिए है।

⋮ 
test "${PWD%/.git}" != "$PWD" && cd .. 
unset GIT_DIR GIT_WORK_TREE 
# you can now safely use Git commands 
⋮ 

एक और समाधान स्पष्ट रूप से GIT_DIR को रीसेट करना है, GIT_WORK_TREE और chdir सेट करें। गिट अकसर किये गए सवाल “Why won't I see changes in the remote repo after "git push"?”post-update script की सिफारिश करता है जो यह करता है। लिंक्ड स्क्रिप्ट भी अधिक सुरक्षित है क्योंकि हार्ड रीसेट करने से पहले इंडेक्स या वर्किंग पेड़ गंदा है तो इससे छेड़छाड़ होती है।

git --git-dir=. --work-tree=$PWD/.. reset --hard 

अधिक सटीक होना, सर्वर पर फ़ाइल .git/hooks/post-receive संपादित:

+0

उत्कृष्ट सामान, धन्यवाद – sehe

+1

+1 आर्ग, यह भयानक है। इससे भी बदतर, मुझे पहले एहसास नहीं हुआ था कि एक गैर-नंगे भंडार में चलाने पर $ PWD और $ GIT_DIR विभिन्न हुक के लिए संगत नहीं हैं। (उदाहरण के लिए 'पोस्ट-प्रतिबद्ध' में वे क्रमशः काम कर रहे पेड़ और '.git' पर सेट हैं।) –

+0

@ मार्क: हम्म, मैंने" स्थानीय "हुक पर ज्यादा विचार नहीं किया था। ऐसा लगता है कि यह केवल "रिमोट" हुक (भिन्नता प्राप्त और अद्यतन) हो सकता है जो इस समस्याग्रस्त वातावरण को स्थापित करता है। अन्य हुक अधिकांशतः उन गतिविधियों के लिए लक्षित होते हैं जिनके लिए एक काम करने वाले पेड़ की आवश्यकता होती है और वे गिट कमांड के लिए एक साइन कॉन्फ़िगरेशन के साथ चलते हैं, जिन्हें एक काम करने वाले पेड़ की आवश्यकता होती है (जो समझ में आता है क्योंकि ऐसे हुक आमतौर पर उन आदेशों से आते हैं जिन्हें काम करने वाले पेड़ की आवश्यकता होती है) । –

13

संक्षेप में, हुक एक लाइनर का उपयोग

#!/bin/sh 
git --git-dir=. --work-tree=$PWD/.. reset --hard 

सेट यह निष्पादन:

chmod +x .git/hooks/post-receive 

क्लाइंट से इस रेपो को दबाते समय, इसे कुछ कहना चाहिए:

HEAD is now at abcd123 comment 
+1

यहां तक ​​कि पर्यावरण से निपटने से बेहतर और सवाल पूछने से पहले गिट में उपलब्ध है। – digenishjkl

+1

स्वीकार्य उत्तर होना चाहिए। – sjy

संबंधित मुद्दे