2010-02-22 13 views
12

हम एक केंद्रीय रेपो (गिटोसिस का उपयोग करके) के साथ गिट का उपयोग कर रहे हैं। जब भी केंद्रीय रिपो में परिवर्तनों को धक्का दिया जाता है, और गिट रेपो में दस्तावेज़ फ़ोल्डर से दस्तावेज़ उत्पन्न करने के लिए मैंने dev मेलिंग सूची में एक ईमेल उत्पन्न करने के लिए एक पोस्ट-प्राप्त हुक बनाया है।गिट पोस्ट-प्राप्त हुक काम नहीं कर रहा

इसलिए, ~ गिट/मुझे एक निर्देशिका मिली है, हम इसे 'ए' कहते हैं जिसमें गिट रेपो का क्लोन होता है। पोस्ट-प्राप्त हुक इस तरह दिखता है:

#!/bin/bash 
cd ~git/repositories/a.git 
. ~git/post-receive-email &> /dev/null 
(cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log) 

ईमेल स्क्रिप्ट काम कर रही है, लेकिन दस्तावेज़ीकरण पीढ़ी नहीं है। pull_log.log की सामग्री है:

fatal: Not a git repository: '.' 

कौन सा मुझे लगता है कि यह ऊपर स्क्रिप्ट की लाइन 5 में सही निर्देशिका को नहीं बदल रहा है बनाता है। क्या मै गलत हु? में इससे कैसे चला सकता हूँ?

संपादित करें: मैंने प्रतिक्रियाओं में सुझाए गए पोस्ट-प्राप्त हुक को अपडेट किया है। स्क्रिप्ट अब है:

#!/bin/bash 
function die { 
    echo "$*" >&2; exit 1 
} 

function checkgit { 
    [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir" 
} 


cd ~git/repositories/a.git 
. ~git/post-receive-email &> /dev/null 
(set -x 
checkgit ~git/a 
cd ~git/a 
checkgit . 
pwd 
git pull 
php ~git/a/scripts/generate_markdown_documentation.php) 

और मैं Git धक्का से निम्न आउटपुट प्राप्त:

+ checkgit /var/git/a 
+ '[' -d /var/git/a/.git ']' 
+ cd /var/git/a 
+ checkgit . 
+ '[' -d ./.git ']' 
+ pwd 
/var/git/a 
+ git pull 
fatal: Not a git repository: '.' 
+ php /var/git/a/scripts/generate_markdown_documentation.php 

किसी भी और अधिक मदद की?

ओह, और यदि मैं स्वयं स्क्रिप्ट चलाने के लिए, यह

समस्या की खोज की (कह हुक/उत्तर प्राप्त द्वारा मैं इसे चलाने) serverfault के लिए काम करता है, धन्यवाद - मूल रूप से, वातावरण चर GIT_DIR और GIT_WORK_TREE सेट कर रहे हैं जब हुक चलता है, और ये गिट को प्रतिकूल रूप से खींचते हैं। चर को अनसेट करने से समस्या ठीक हो जाती है।

+2

'git pull 'को' pwd' में बदलें और देखें कि लॉग में क्या दिखाई देता है। –

+0

ओह! बुरा। समस्या को ट्रैक करने और इसे मारने के लिए +1! –

+0

आपको pull_log.log फ़ाइल कैसे मिली? मुझे नहीं पता कि लॉग कहां संग्रहीत हैं ... – munmunbb

उत्तर

3

आप दायां कोष्ठक के बाद अधिक निदान, जैसे की जरूरत है,

function die { 
    echo "$*" >&2; exit 1 
} 

function checkgit { 
    [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir" 
} 

इस बिंदु पर, subshell में, आप की तरह

set -x # show exactly what's executed (writes to stderr) 
checkgit ~git/a 
cd ~git/a && checkgit . && git pull ... 

सामान की कोशिश कर सकते तुम भी पूरे stderr पुनः निर्देशित की सोच सकते हैं सबहेल का, उदाहरण के लिए,

(...) 2>/tmp/mydiagnosis$$.log 

(यह एक अस्थायी उपाय है और केवल ठीक है वहाँ लॉग में कोई गोपनीय जानकारी है।)


ठीक सिलास, आपके अतिरिक्त जानकारी अजीब संभावनाओं का एक बहुत बाहर नियम। मैं अपने git फू का अंत निकट आ रही है, लेकिन यहाँ कुछ और बातें की कोशिश कर रहे हैं:

  1. ~git/a में जाकर और यदि आप इसे हाथ से git pull करा सकते हैं। यह असफल होना चाहिए।
  2. ~git/a में मिला और git status चलाएं। यह भी असफल होना चाहिए। यदि ऐसा नहीं होता है, तो git आपको एक बहुत ही खराब त्रुटि संदेश दे रहा है।

यदि दोनों चरण विफल हो जाते हैं, तो ~git/a क्लोन नहीं है जिसे आपने सोचा था।इसका नाम बदलें, एक नया क्लोन बनाएं, और देखें कि क्या आप लगातार जारी रह सकते हैं।

यदि पहला कदम हाथ से सफल होता है, तो कुछ अजीब चल रहा है और मैं परेशान हूं।

पहला कदम विफल रहता है लेकिन दूसरे सफल होता है, तो आप शाखाओं के साथ एक समस्या है हो सकता है:

  • शायद ~git/a रेपो गलत शाखा के लिए सेट है, और अपने रेपो एक शाखा की जरूरत है यह नहीं है । git branch -a आज़माएं और देखें कि क्या आप कुछ अप्रत्याशित देखते हैं।

  • शायद आपके पास शाखा है, लेकिन यह रिमोट रिपोजिटरी से ठीक से जुड़ा हुआ नहीं है। इस बिंदु पर आपको ~git/a/.git/config में गोता लगाने की ज़रूरत है, और मुझे वास्तव में यह नहीं पता कि आपको यह जानने के लिए कि आपको वहां क्या उम्मीद करनी चाहिए। उस बिंदु पर आपको वास्तविक गिट विशेषज्ञ की आवश्यकता होगी; मैं सिर्फ टीवी पर एक खेलता हूं।

+0

क्या आप एक और नजर डाल सकते हैं? मैंने आपके द्वारा मांगी गई जानकारी को जोड़ा है। – Silas

+1

@ सिलास: कोशिश करने के लिए कुछ और चीजें जोड़े गए। –

+0

मैंने असली समस्या की खोज की - ऊपर अद्यतन अद्यतन देखें। – Silas

0

मैंने हाल ही में एक ही समस्या में भाग लिया और मुझे लगता है कि यह पर्यावरण चर से संबंधित है जो विशेष रूप से $ GIT_DIR चर सेट करता है। यदि आपके पास वह सेट है, तो अन्य रिपोज़ पर सभी गिट कमांड अजीब तरीके से कार्य करना शुरू कर देते हैं। असल में मुझे लगता है कि हुक के अंदर अपने गिट खींचने को एक तटस्थ खोल वातावरण में बुलाया जाना चाहिए जिसमें उन विषम चर नहीं हैं और गिट भ्रम की ओर जाता है, हालांकि मुझे पता नहीं चला कि अभी तक ऐसा कैसे किया जाए।

0

unset GIT_DIR एक समाधान है जो आप देख रहे घातक त्रुटि के लिए काम करता है।

यह हुक में सभी स्क्रिप्ट पर लागू होता है (पोस्ट-अपडेट एक और आम है), जो इसके अंदर गिट कमांड का उपयोग करता है। git कमांड pwd के बजाय env से GIT_DIR का उपयोग करता है।

आगे स्पष्टीकरण के लिए https://stackoverflow.com/a/4100577 देखें।

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