2010-04-13 16 views
24

मैं ऐसा है कि मेरे सर्वर पर एक के बाद अद्यतन हुक है, जब मैंक्या उपयोगकर्ता गिट हुक चलाता है?

git push 

यह लाइव वेब निर्देशिका पर एक पुल है। हालांकि, जब धक्का हमेशा सफल होता है, तो पोस्ट-अपडेट हुक कभी-कभी विफल हो जाता है।

हुक बहुत सरल है:

#!/bin/sh 
# 
# An example hook script to prepare a packed repository for use over 
# dumb transports. 
# 
# To enable this hook, rename this file to "post-update". 
cd /var/www 
env -i git pull 

मैं स्थानों की एक किस्म से अद्यतन धक्का कर रहा हूँ, लेकिन कभी कभी मैं सर्वर पर रूट के रूप में लॉग इन करने की जरूरत है और एक

env -i git pull 

कर manuall मुझे केवल समय के 20% करना है। कोई विचार क्यों यह यादृच्छिक रूप से विफल होगा? साथ ही, मैं इसे त्रुटि संदेशों को लॉग करने के लिए कैसे प्राप्त करूंगा, क्योंकि यह किसी ऐसे व्यक्ति के रूप में चल रहा है जो फ़ाइल सिस्टम पर नहीं लिख सकता है?

+0

रूप में चलाया जाता क्या आप उन सभी स्थानों से उसी तरह धक्का दे रहे हैं? यही है, रिमोट यूआरएल उन सभी के लिए समान है? (विशेष रूप से, उपयोगकर्ता @ होस्टनाम भाग) – Cascabel

+0

इसके अलावा, जब आप कहते हैं कि यह विफल रहता है, तो क्या आपको वास्तव में यह त्रुटि से इनकार करने में त्रुटि से असफल हो जाता है जो इंगित करता है कि यह अपर्याप्त विशेषाधिकार वाले उपयोगकर्ता के रूप में चल रहा है? या क्या यह कुछ पूरी तरह से असंबंधित कारणों में विफल रहा है, यूआईडी के साथ ऐसा करने के लिए कुछ भी नहीं है? – Cascabel

+0

मैं वास्तव में विभिन्न स्थानों से धक्का दे रहा हूं: कभी-कभी यह उपयोगकर्ता 1 @ होस्टनाम, अन्य समय, उपयोगकर्ता 2 @ होस्टनाम, आदि (वे सभी को यह समस्या है)। यह एक त्रुटि संदेश के बिना विफल रहता है जिसे मैं देख सकता हूं, और मुझे यकीन नहीं है कि एक कैसे प्राप्त करें। मेरे पोस्ट-अपडेट में, मैंने जोड़ा,> $ user> /log.txt गूंजें, लेकिन वहां कुछ भी लिखा नहीं गया है (न ही फ़ाइल बनाई गई है)। इससे मुझे लगता है कि उपयोगकर्ता धक्का दे रहा है, इसकी कोई अनुमति नहीं है। लेकिन अगर मैं एक त्रुटि संदेश भी नहीं लिख सकता, तो मुझे कैसे पता चलेगा? – ash

उत्तर

18

उपयोगकर्ता धक्का दे रहे हैं जैसे हुक चलाए जाते हैं। यदि आपके पास पूर्व-निर्मित सेटअप का कोई प्रकार है, तो यह git या gitosis जैसे उपयोगकर्ता हो सकता है, या यह हो सकता है। बस देखें कि आपके पास रिमोट कॉन्फ़िगर कैसे है। (git remote show <remote-name> या अगर आप नहीं जानते हैं तो बस .git/config की जांच करें) संभवतः आप एसएसएच के माध्यम से धक्का दे रहे हैं, और यूआरएल में उपयोगकर्ता नाम @ होस्टनाम है।

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

2

मैं एक बनाने के द्वारा मेरे gitlab 6 सर्वर पर इस परीक्षण करने का फैसला बाहर उपयोगकर्ता जानकारी

$ cat /home/git/repositories/foo/foo.git/hooks/pre-recieve 
#!/bin/bash 
set -x 
echo -e "The user the hook is run as is $USER" 
echo -e "Just to doublecheck, the user is $(whoami)" 
exit 1 

ऐसा लगता है कि यह Git उपयोगकर्ता

$ git push 
Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done. 
Total 3 (delta 1), reused 0 (delta 0) 
remote: + echo -e 'The user the hook is run as is' 
remote: The user the hook is run as is 
remote: ++ whoami 
remote: + echo -e 'Just to doublecheck, the user is git' 
remote: Just to doublecheck, the user is git 
remote: + exit 1 
+0

कारण यह है कि ऐसे सभी सर्वर एक यूनिक्स उपयोगकर्ता को ~ ~ git/.ssh/valid_keys' फ़ाइल के माध्यम से आने वाले एसएसएच कनेक्शन को स्वीकार करने के लिए कॉन्फ़िगर करते हैं। वह फ़ाइल ऐसे स्क्रिप्ट के लिए ऐसे कनेक्शन प्रस्तुत करती है जो तब आने वाले डेटा से संबंधित होती हैं। ऐसे सर्वरों के लिए कोई व्यक्ति पुश करने वाले व्यक्ति का नाम प्राप्त कर सकता है, उदा। यह मानकर कि यह वही व्यक्ति है जिसने हालिया प्रतिबद्धता की है। हालांकि यह बिल्कुल सही नहीं हो सकता है। उपयोगकर्ताओं के कार्य मॉडल पर निर्भर करता है। व्यक्तिगत प्रतिबद्धताओं पर लेखक/कमिटर की जांच या रिपोर्ट करने के लिए बेहतर है। – cfi

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