2011-11-14 8 views
12

के माध्यम से गिट पुल आसानी से निदान करने के लिए सबसे कठिन समस्या है जिसे मैंने कभी अनुभव किया है। मुझे कॉल करने में असमर्थ लगता है:PHP निष्पादन आईआईएस

exec('call git pull', $output); 

प्रक्रिया लटकती है और आईआईएस को इसके साथ ले जाती है।

exec('call git status', $output); //works fine 

यहाँ मैं क्या किया है:

  • जनरेट किया RSA कुंजी GitHub को जोड़ा गया (पासकोड खाली है)
  • हर कोई mysite/.git/ पर अनुमति है तथा Program Files/git/bin और cmd.exe
  • ssl की कोशिश की 'स्लैश' मुद्दे के साथ अन्य पदों में उल्लिखित प्रमाणपत्र फिक्स
  • एसएसएच
  • के बजाय https: // का उपयोग करने का प्रयास किया
  • की कोशिश की stderr को 2>NUL और 2>&1

जाहिर पाइपिंग, वहाँ एक अनुमतियाँ मुद्दा है जहां exec कॉल cmd.exe जो बारी में कॉल git.exe, जो बारी में sh.exe कॉल GitHub, जो बारी में git-pull और संभवतः का उपयोग करता है से कनेक्ट करने के git-send-pack और भगवान और क्या जानते हैं।

मुझे लगता है कि 'sh.exe' अनुमान लगाता है कि वर्तमान उपयोगकर्ता आईयूएसआर है और इसे प्रमाणित करने के लिए आरएसए कुंजी नहीं मिल रहा है।

यदि मैं यह समझ सकता हूं कि ssh-keygen आईयूएसआर खाता कैसे है, तो मैंने कोशिश की होगी।

अगर मैं यह समझ सकता हूं कि exec गिट के बजाय गिट बैश कैसे करें (cmd.exe के माध्यम से) मैंने कोशिश की होगी।

मैं PHP के exec विधि के माध्यम से मेरी GitHub रेपो से खींच है:

यहाँ प्रश्न में यह सरलतम रूप है?

समस्या निश्चित रूप से एसएसएच के साथ प्रतीत होती है, लेकिन मैं कोशिश करने के लिए सब कुछ खत्म कर रहा हूं।

सहायता!

+0

आप केवल 'गिट पुल' के बजाय 'कॉल गिट पुल' का उपयोग क्यों कर रहे हैं? – gustavotkg

+0

कॉल केवल पढ़ने के रूप में exec() का उपयोग करने के लिए 'अनुशंसित' दृष्टिकोण था - मैंने दोनों विधियों का प्रयास किया है और कोई सराहनीय अंतर नहीं देखा – rmirabelle

+0

मैं काफी सकारात्मक हूं कि आपको लेखन अनुमतियों के साथ समस्याएं आ रही हैं। यदि आप गिट स्टेटस बनाम गिट पुल के बीच अंतर के बारे में सोचते हैं .. एक संग्रह के बारे में जानकारी प्रदर्शित करता है जबकि दूसरा वास्तव में फाइल सिस्टम स्तर परिवर्तन करता है। – Kevin

उत्तर

12

मैं आज एक ही समस्या का सामना करना पड़ा और प्रक्रिया की निगरानी के लिए इस्तेमाल किया देखने के लिए क्या हो रहा था और पाया कि है कुछ कारणों sh.exeC:\Windows\SysWOW64\config\systemprofile\.ssh में चाबी के लिए लग रहा था के लिए। तो मैंने उस फ़ोल्डर में C:\Users\Administrator\.ssh में सब कुछ कॉपी किया और यह पूरी तरह से काम किया।

+1

विजेता! मुझे इस निर्देशिका में स्पष्ट अनुमतियां भी प्रदान करनी थीं, लेकिन यह वास्तव में काम कर रही है। चमत्कार हासिल हुआ, दिन बचाया गया, दुनिया ने एक बेहतर स्थान बनाया, बक्षीस – rmirabelle

+0

हालांकि इसने मेरे प्रश्न का उत्तर नहीं दिया, लेकिन उसने मुझे सही दिशा में इंगित किया, मुझे लगता है कि यह बक्षीस के योग्य है ;-) – derickito

+0

आपको यह कैसे पता चला? – Petah

0

आपको cmd.exe पर सीधे अनुमति देना होगा। विंडोज़ के संस्करण और आपके ऐप-पूल सेटअप के तरीके के आधार पर यह आईआईएस_आईयूएसआर, आईयूएसआर, और/या नेटवर्क सेवा हो सकता है। Cmd.exe पर पूर्ण अनुमतियों वाले उपयोगकर्ता को जोड़ें।

मैं, निश्चित रूप से, ऐसा करने की अनुशंसा नहीं करता क्योंकि इसके प्रत्यक्ष सुरक्षा प्रभाव हैं। उस ने कहा, मुझे विंडोज़ में ऐसा करने का कोई और तरीका नहीं मिला है।

+0

पहले से ही कुछ समय पहले अनुमतियां दी गई हैं - अभी भी कोई प्यार नहीं – rmirabelle

0

आपको proc_open का उपयोग करने की आवश्यकता है और इस प्रकार समस्या को देखेंगे जो अधिकतर अनुमति से संबंधित है।

यहाँ एक script I use है:

<?php 

//error_reporting(E_ALL); 
ignore_user_abort(true); 

function syscall ($cmd, $cwd) { 
    $descriptorspec = array(
     1 => array('pipe', 'w'), // stdout is a pipe that the child will write to 
    ); 
    $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd); 
    if (is_resource($resource)) { 
     $output = stream_get_contents($pipes[1]); 
     fclose($pipes[1]); 
     proc_close($resource); 
     return $output; 
    } 
} 

// GitHub will hit us with POST (http://help.github.com/post-receive-hooks/) 
if (!empty($_POST['payload'])) { 

    // pull from master 
    $result = syscall('git pull', '/var/www/example.com'); 

    // send us the output 
    mail('[email protected]', 'GitHub hook `git pull` result', $result); 

    // clear APC 
    if (apc_clear_cache('opcode') == false) { 
     mail('root', 'Unable to apc_clear_cache()', ''); 
    } 

} 

?> 
+0

शायद यह मार्गदर्शिका सहायता कर सकती है: http://technotes.tumblr.com/post/33867325150/php-hook-script-that-can-git-pull-apc-clear- कैश – webjay

+0

चमत्कारी रूप से और बहुत, यह स्क्रिप्ट मेरे मौजूदा कोड के समान रूप से विफल हो जाती है :-( – rmirabelle

1

php Git पुस्तकालयों/उपकरणों की एक संख्या हैं। https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#git-php

व्यक्तिगत रूप से मैं GLIP साथ हैकिंग की है (php में Git पुस्तकालय) http://fimml.at/#glip

मैं मैं कहाँ एक संग्रह समारोह जोड़ लिया है GitHub पर एक स्रोत कांटा है। मूल रूप से मैं गतिशील रूप से एक गिट कमांड बनाता हूं और इसे कॉल करने के लिए php की passthru विधि का उपयोग करता हूं। शायद मेरे कोड को देखकर आपको कुछ अंतर्दृष्टि मिल सकती है। यहाँ प्रतिबद्ध https://github.com/fontvirus/glip/commit/89127f7f9a4dc61697929f36684533406f348ffe

0

मैं यहां पर जो कुछ भी था, उसका पालन करके आंशिक रूप से काम करने में सक्षम था। मैं एक बैच स्क्रिप्ट जो

ssh-agent -s
ssh-add -l

दौड़ा देखने के लिए मैं क्या चाबियाँ था भाग गया। इन आदेशों को चलाने से पहले मैंने HOME=/c/Users/Username पर्यावरण चर को अपने उपयोगकर्ता को सही ssh कुंजी के साथ सेट किया है।

+0

मैं एक नज़र डालेगा, धन्यवाद – rmirabelle

0

(मैं यूनिक्स पथ का उपयोग कर रहा हूँ क्योंकि मैं यह Git बैश के साथ चल रहा था) मैं खिड़की के वातावरण

लेकिन मुख्य समस्याओं के बारे में काफी यकीन नहीं है ".php फ़ाइल" कि फोन कार्यकारी आदेश नहीं है व्यवस्थापक के रूप में अनुमति (या * एनआईक्स ओएस में रूट)

मेरे पर्यावरण में मैंने उस फ़ाइल को रूट (जैसे सुडो चीजों) के रूप में विशेषाधिकार प्राप्त करने के लिए दिखाया है एक और तरीका नया उपयोगकर्ता समूह बना रहा है जिसमें अनुमति 777 है और उस फ़ाइल को असाइन करें उस उपयोगकर्ता के समूह के पास

आशा है कि यह सहायता

0

मुझे आज इस मुद्दे का सामना करना पड़ा और इसे एक अलग तरीके से हल किया गया।

मेरी समस्या यह थी कि आईयूएसआर में एसएसएच कुंजी या गिट क्रेडेंशियल्स फ़ाइल को रखने के लिए घर फ़ोल्डर नहीं था।

मैं एक .sh फ़ाइल कि Git कॉल करने से पहले गृह चर बदल बनाया है, सही जगह पर मेरी चाबियाँ डाल के रूप में अगर यह है कि यह घर फ़ोल्डर, तो .sh चलाने के लिए sh.exe इस्तेमाल किया है था

#!/bin/bash 
export HOME="/c/some/location" 
git pull 
1

मैं विंडोज सर्वर 2012 चला रहा हूं और काम करने के लिए Iamz के समाधान को प्राप्त करने में सक्षम नहीं था।

मैंने अपने C:\ में ".ssh" की खोज की और ध्यान दिया कि C:\Program Files (x86)\Git\.ssh पर एक और .ssh फ़ोल्डर था। मैंने इस सामग्री में C:\Users\Administrator\.ssh से सभी सामग्री की प्रतिलिपि बनाई है, IUSR पहुंच की अनुमति देने के लिए अनुमतियां सेट करें, और सब कुछ कोशेर था।

+0

मेरे लिए काम नहीं कर रहा है, मैं गिट स्थिति करने में सक्षम हूं लेकिन गिट खींच नहीं –

0

Iamz के समाधान के एक और प्रकार (निर्देशिका C:\Windows\System32\config\systemprofile\.ssh

मैं अपने आईआईएस सर्वर है, जो तुरंत संकेत दिया कि C:\Windows\System32\config\systemprofile\.ssh याद आ रही थी पर निम्न स्क्रिप्ट चलाकर कि पर पहुंचे का उपयोग $ path_of_git सेट करें और $ के रूप में उपयुक्त path_to_repo है अपने मशीन) के लिए:

<?php 
$descriptorspec = array(
    0 => array("pipe", "r"), // stdin 
    1 => array("pipe", "w"), // stdout 
    2 => array("pipe", "w"), // stderr 
); 
$path_of_git = 'c:\\path\\to\\git'; 
$path_to_repo = 'C:\\inetpub\\repo'; 
$process = proc_open($path_of_git.' fetch', $descriptorspec, $pipes, $path_to_repo, null); 
$stdout = stream_get_contents($pipes[1]); 
fclose($pipes[1]); 
echo '<pre>'.htmlspecialchars($stdout).'</pre>'; 
$stderr = stream_get_contents($pipes[2]); 
fclose($pipes[2]); 
echo '<pre style="color:red;">'.htmlspecialchars($stderr).'</pre>'; 
echo '<p>return value=' . proc_close($process) . '</p>'; 
?> 

सभी ही कहा जा रहा, मैं अभी भी अनुमति मुद्दों से आक्रांत कर रहा हूँ, इसलिए मैं यह करने के लिए उपयोगी पाया है सिर्फ घोषणा करते हैं कि HOME कहीं और है कि IUSR आसानी से एक Git से पहले करने के लिए प्राप्त कर सकते है आदेश, और पूरे थाई निष्पादित करें गिट sh के साथ एनजी। उदाहरण के लिए:

\pathToGit\bin\sh -c "export HOME='/c/somewhereIUSRCanGetTo/';git fetch"

कहाँ C:\somewhereIUSRCanGetTo\.ssh\ शामिल निजी कुंजी और allowed_hosts फ़ाइलों

0

dir USERPROFILE करने के लिए अपने .ssh फ़ोल्डर में ले जाएँ। आप इस वैश्विक चर $ _SERVER ['USERPROFILE'] में ऐप प्रोफाइल डीआईआर देख सकते हैं। मेरे मामले में यह सी: \ विंडोज \ system32 \ config \ systemprofile है। फिर उपयोगकर्ताओं के लिए इस फ़ोल्डर (.ssh) को पढ़ने/लिखने की अनुमति दें: IIS_IUSRS, IUSR