समस्या यह है कि कैसे गिट कमांड आपके सामान्य वातावरण बनाम हुक स्क्रिप्ट के लिए बनाए गए पर्यावरण में व्यवहार करते हैं।
सबसे पहले, हुक स्क्रिप्ट्स अपनी वर्तमान कार्य निर्देशिका के साथ गिट निर्देशिका में सेट की गई हैं (यानी .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
संपादित:
आपको इसके साथ समस्या होने पर वास्तव में अपनी हुक स्क्रिप्ट पोस्ट करनी चाहिए। –
क्रिस, मेरी पोस्ट-प्राप्त स्क्रिप्ट में केवल उस पंक्ति में शामिल है। पोस्ट करने की कोई जरूरत नहीं है। – David