git-upload-pack: कमांड नहीं मिला, जब दूरस्थ Git repo को क्लोन किया गया


170

मैं अपने प्रोजेक्ट की दो प्रतियां सिंक में रखने के लिए git का उपयोग कर रहा हूं, एक मेरा स्थानीय बॉक्स है, दूसरा टेस्ट सर्वर है। यह एक समस्या है जो तब होती है जब मैं ssh का उपयोग करके हमारे रिमोट डेवलपमेंट सर्वर पर लॉग इन करता हूं;

git clone me@me.mydevbox.com:/home/chris/myproject
Initialized empty Git repository in /tmp/myproject/.git/
Password:
bash: git-upload-pack: command not found
fatal: The remote end hung up unexpectedly
fetch-pack from 'me@me.mydevbox.com:/home/chris/myproject' failed.

(दोषियों को बचाने के लिए फ़ाइल-नाम बदल दिए गए हैं ...!)

दोनों बॉक्स सोलारिस 10 एएमडी चलाते हैं। मैंने कुछ खुदाई की है, अगर मैं --upload-pack=$(which git-upload-pack)कमांड कार्यों को जोड़ता हूं , (और साबित करता है कि $PATHRTFM समाधान के अनुसार 'git-upload-pack' के लिए पथ शामिल है), लेकिन यह वास्तव में कष्टप्रद है, प्लस 'git push' काम नहीं करता है, क्योंकि मुझे नहीं लगता कि कोई --unpack=विकल्प है।

संयोग से, सभी गिट कमांड मेरे स्थानीय बॉक्स से ठीक काम करते हैं, यह उसी NFS माउंट पर स्थापित सॉफ्टवेयर (1.5.4.2) का एक ही संस्करण है /usr/local/bin

क्या कोई मदद कर सकता है?

जवाबों:


169

सुनिश्चित करें कि git-upload-packएक गैर-लॉगिन शेल से पथ पर है। (मेरी मशीन पर यह है /usr/bin)।

यह देखने के लिए कि एक गैर-लॉगिन शेल से दूरस्थ मशीन पर आपका पथ कैसा दिखता है, इसे आज़माएँ:

ssh you@remotemachine echo \$PATH

(जो बाश, ज़श और टीसीएस में काम करता है, और शायद अन्य गोले भी।)

यदि यह जिस पथ को वापस देता है, उसमें वह निर्देशिका शामिल नहीं है जिसके पास git-upload-packआपको इसे .bashrc(बैश के लिए), .zshenv(Zsh के लिए), .cshrc( tsh के लिए) या अपने शेल के बराबर सेट करके इसे ठीक करने की आवश्यकता है ।

आपको दूरस्थ मशीन पर यह परिवर्तन करने की आवश्यकता होगी।

यदि आप सुनिश्चित नहीं हैं कि आपको अपने रिमोट से कौन सा रास्ता जोड़ना है PATH, तो आप इसे इस कमांड से पा सकते हैं (आपको रिमोट मशीन पर इसे चलाने की आवश्यकता है:

which git-upload-pack

मेरी मशीन पर जो प्रिंट करता है /usr/bin/git-upload-pack। तो इस मामले में, /usr/binक्या आपको यह सुनिश्चित करने की आवश्यकता है कि आपके दूरस्थ गैर-लॉगिन शेल में क्या है PATH


2
यदि मैं अपनी मशीन पर कमांड चलाता हूं, तो रास्ता सही था, लेकिन अगर मैं इसे दूसरे तरीके से चलाता हूं तो गलत है। (रिमोट मशीन से वापस मेरा) मेरे स्थानीय .bashrc संपादन यह तय किया। धन्यवाद
क्रिस हुआंग-लीवर

6
ओएसएक्स तेंदुए पर काम किया
नूह कैंपबेल

1
मेरे मामले में कमांड नहीं मिली क्योंकि मैक मैकपोर्ट्स के माध्यम से स्थापित किया गया था, जो इसे अंदर डालता है /opt/local/bin। मेरे लिए इस के .bashrcमाध्यम से जोड़ना मेरे PATH=$PATH:/new/path/hereलिए काम किया।
बेन शीहिरमैन

1
@ranReloaded बैकस्लैश को डॉलर चिह्न से बचने और स्थानीय मशीन पर $ PATH के विस्तार को रोकने के लिए माना जाता है, और इसके बजाय "इको $ PATH" को शाब्दिक रूप से रिमोट मशीन को पास करना है। यह इस बात पर निर्भर हो सकता है कि आप किस शेल का उपयोग कर रहे हैं; यह मेरे लिए zsh और bash में काम करता है। आप एकल उद्धरणों का उपयोग करके सही परिणाम प्राप्त करने में सक्षम हो सकते हैं, उदाहरण के लिए "ssh you @ remotemachine 'echo $ PATH'" - कि एक जाना। अन्यथा, आप किस शेल का उपयोग कर रहे हैं? हो सकता है कि कोई दूसरा व्यक्ति उस शेल का उपयोग करता हो और आपको वर्कअराउंड दे सकता है।
मैट कर्टिस

3
@ranReloaded: जब आप कहते हैं कि "गिट पथ मुद्रित नहीं होता है", तो क्या आपका मतलब है कि ssh बहुत सारी चीजें दिखाता है, लेकिन वह रास्ता नहीं है जो गिट पर है? यदि ऐसा है तो आपके पास सिर्फ वही समस्या है जो ओपी के पास थी, और सिमलिंक का उपयोग करना सिर्फ एक बैंडेड है। "ssh .. echo \$PATH" आदेश आप रिमोट मशीन है, जो अपनी प्रवेश पथ के लिए अलग हो सकता है पर पथ दिखाया जाएगा, लेकिन इस महत्वपूर्ण बात यह है कि यह काम करने का अधिकार प्राप्त करने के लिए है, और आप ऐसा कर सकते हैं पथ की स्थापना में शामिल करने के लिए Git द्वारा .bashrcपर रिमोट मशीन। मैनपेज के अनुसार, .profile/ .bash_profileकेवल इंटरएक्टिव लॉगिन के लिए पढ़े जाते हैं।
मैट कर्टिस

66

आप पथ निर्दिष्ट करने के लिए "-u" विकल्प का भी उपयोग कर सकते हैं। मुझे यह उन मशीनों पर मददगार लगता है जहाँ मेरे .bashrc को गैर-संवादात्मक सत्रों में खटास नहीं मिलती है। उदाहरण के लिए,

git clone -u /home/you/bin/git-upload-pack you@machine:code

2
उसके लिए धन्यवाद। मैं वास्तव में ~ / .bashrc फ़ाइल को बदलना नहीं चाहता था।
लुइस

2
बस ध्यान दें: यहां निर्देश दिए गए हैं कि कैसे बनाया जाए।
sp3ctum

58

ब्रायन के उत्तर पर बिल्डिंग , अपलोड-पैक पथ को क्लोनिंग के बाद निम्नलिखित कमांड चलाकर स्थायी रूप से सेट किया जा सकता है, जो --upload-packबाद में खींचने / लाने के अनुरोधों की आवश्यकता को समाप्त करता है। इसी तरह, प्राप्त-पैक स्थापित करने से --receive-packपुश अनुरोधों की आवश्यकता समाप्त हो जाती है ।

git config remote.origin.uploadpack /path/to/git-upload-pack
git config remote.origin.receivepack /path/to/git-receive-pack

ये दोनों कमांड एक रेपो के लिए निम्नलिखित पंक्तियों को जोड़ने के बराबर हैं .git/config

[remote "origin"]
    uploadpack = /path/to/git-upload-pack
    receivepack = /path/to/git-receive-pack

clone -uनिम्न उपनाम वाले लोगों की बार-बार रुचि हो सकती है। मायक्लोन आत्म-व्याख्यात्मक होना चाहिए। myfetch / mypull / mypush रेपोस जिसका config के रूप में प्रतिस्थापित करके ऊपर वर्णित संशोधित नहीं किया गया पर इस्तेमाल किया जा सकता git pushके साथ git mypush, और इतने पर।

[alias]
    myclone = clone --upload-pack /path/to/git-upload-pack
    myfetch = fetch --upload-pack /path/to/git-upload-pack
    mypull  = pull --upload-pack /path/to/git-upload-pack
    mypush  = push --receive-pack /path/to/git-receive-pack

--receive-packविकल्प का उल्लेख करने के लिए धन्यवाद git-push!
एक्सल

1
कॉन्फ़िगरेशन विकल्पों का उल्लेख करने के लिए धन्यवाद, यह उपयोगकर्ता-स्थान से एक उपयोगी स्पर्श है।
एरन अहमदिया

मैंने आपके सुझाव की कोशिश की, "। Git-Rece-pack" को पथ में जोड़ने के लिए .bashrc लेकिन किसी तरह git पुश अभी भी मेरे लिए काम नहीं करता है, हालांकि रेपो अपलोड ठीक काम करता है। किसी भी विचार क्यों ऐसा हो सकता है?
coredump

@coredump, "Remote.origin.receivepack" सेट करने से आपके .bashrc में PATH को संशोधित करने की आवश्यकता समाप्त हो जानी चाहिए। अपने आप git push --receive-pack /full/path/to/git-receive-packपर प्रयास करें , तब तक ट्विक करें जब तक कि सफल न हो, फिर संशोधित करें .it / config (या "git config" चलाएं) प्राप्त-पैक पथ को स्थायी रूप से सेट करने के लिए।
गैरेट

आपके उत्तरों के लिए हर एक का धन्यवाद! मेरे मामले में फ़ेच सर्वर और पुश सर्वर अलग थे और फ़िंच सर्वर में लिखने की अनुमति नहीं थी। जब मैं git पुश का उपयोग करता हूं <पुश-सर्वर> <शाखा> सब कुछ ठीक काम करता है।
coredump

30

मैंने इसे ठीक किया (सफलतापूर्वक) पाया और इस्तेमाल किया:

# Fix it with symlinks in /usr/bin
$ cd /usr/bin/
$ sudo ln -s /[path/to/git]/bin/git* .

पॉल जॉनसन को धन्यवाद ।


मेरे लिए भी तय है। धन्यवाद!
जॉन बॉलिंजर

12

Mac OS X और कुछ अन्य यूनिक्स में कम से कम उपयोगकर्ता पथ को सुरक्षा कारणों से sshd में संकलित किया गया है, इसलिए हम में से जो git / usr / local / git / {bin, lib, ...} के रूप में git स्थापित करते हैं, git के रूप में मुसीबत में चल सकते हैं निष्पादक पूर्वनिर्मित पथ में नहीं हैं। इसे ओवरराइड करने के लिए मैं अपने / etc / sshd_config को बदलना पसंद करता हूं:

#PermitUserEnvironment no

सेवा

PermitUserEnvironment yes

और फिर जरूरत के अनुसार ~ / .ssh / पर्यावरण फाइल बनाएं। मेरे git उपयोगकर्ताओं के पास उनकी ~ / .ssh / पर्यावरण फ़ाइल में निम्नलिखित हैं:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

नोट चर विस्तार तब नहीं होता है जब ~ / .ssh / पर्यावरण फ़ाइल को पढ़ा जाता है:

PATH=$PATH:/usr/local/git/bin

काम नहीं करेगा।


यह बिल्कुल सही टिप की तरह लगता है, लेकिन यह यहां 10.6.6 के लिए काम नहीं कर रहा है। ssh user @ host echo \ $ PATH अभी भी हार्ड कोडित बिल्ड पाथ दिखाता है। गैर-विस्‍तारित आवश्‍यक पथ के साथ .ssh / परिवेश परिवर्तित / आदि / sshd_config PermitUserEnvironment हाँ। कोई पाँसा नहीं। कोई सुझाव? धन्यवाद।
पिताजी

क्लाइंट मशीन पर BASH_ENV = '~ / .nibashrc' सेट करने की कोशिश की और उसमें विस्तारित पथ के साथ एक फ़ाइल बनाई। कोई पासा भी नहीं।
पिताजी

ठीक। इसलिए मशीन में .bashrc पर पथ डालकर आप मेरे लिए काम कर रहे हैं।
पिताजी

चर विस्तार के बारे में टिप के लिए धन्यवाद .ssh / पर्यावरण के लिए काम नहीं कर रहा है
डेनिस

यह बताने के लिए कि क्या विस्तार विस्तार से काम करता है।
XMAN

7

मैट का समाधान ओएस एक्स पर मेरे लिए काम नहीं करता था, लेकिन पॉल ने किया।

पॉल लिंक से लघु संस्करण है:

/usr/local/bin/ssh_sessionनिम्नलिखित पाठ के साथ बनाया गया:

#!/bin/bash
export SSH_SESSION=1
if [ -z "$SSH_ORIGINAL_COMMAND" ] ; then
    export SSH_LOGIN=1
    exec login -fp "$USER"
else
    export SSH_LOGIN=
    [ -r /etc/profile ] && source /etc/profile
    [ -r ~/.profile ] && source ~/.profile
    eval exec "$SSH_ORIGINAL_COMMAND"
fi

निष्पादित:

chmod +x /usr/local/bin/ssh_session

निम्नलिखित को इसमें जोड़ें /etc/sshd_config:

ForceCommand / usr / स्थानीय / बिन / ssh_session


यह सुनने के लिए दिलचस्प है कि यह आपके लिए काम नहीं करता है। क्या आप बता रहे हैं कि रिमोट मशीन पर PATH ने क्या कहा था, जब आपने "ssh you @ दूरस्थ \ PATH" चलाया था?
मैट कर्टिस


5

मुझे ये त्रुटियां MsysGit संस्करण के साथ मिलीं।

सभी सलाह का पालन करने के बाद मैं यहां और कहीं भी पा सकता हूं, मैंने समाप्त किया:

Git का Cygwin संस्करण स्थापित करना

सर्वर पर (Cygwin SSHD के साथ विन XP), यह अंत में इसे ठीक कर दिया।

मैं अभी भी MsysGit वर्जन क्लाइंट साइड का उपयोग करता हूं

.. वास्तव में, इसका एकमात्र तरीका यह मेरे लिए काम करता है, क्योंकि मुझे पॉज़िक त्रुटियों के साथ Cygwin Git को उसी sshd सर्वर से खींचना है

मुझे संदेह है कि कुछ काम अभी भी Git उपयोग के इस पक्ष की आवश्यकता है .. (ssh + विंडोज में पुल / पुश की आसानी)



1

आपको जोड़ना होगा

export PATH=/opt/git/bin:$PATH

इस लाइन में पहले .bashrc:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

अन्यथा सभी निर्यात विवरण निष्पादित नहीं किए जाएंगे ( यहां देखें )।


1

मेरा मामला जीआईटी बैश के साथ विन 10 पर है और मेरे पास मानक स्थान के तहत जीआईटी नहीं है। इसके बजाय मेरे पास git / app / local / bin है। मैंने @Garrett द्वारा प्रदान की गई कमांड का उपयोग किया, लेकिन डबल /: के साथ शुरू करने के लिए पथ बदलने की आवश्यकता है

git config remote.origin.uploadpack //path/to/git-upload-pack
git config remote.origin.receivepack //path/to/git-receive-pack

अन्यथा जीआईटी आपके विंडोज जीआईटी पथ को सामने जोड़ देगा।


0

Zsh के लिए आपको इसे इस फ़ाइल में रखना होगा: ~ / .zshenv

उदाहरण के लिए, OS X पर MacPorts से git-core पैकेज का उपयोग कर:

$ प्रतिध्वनि का निर्यात पाथ = / ऑप्ट / स्थानीय / sbin: / ऑप्ट / स्थानीय / बिन: $ पाथ>> ~ /.zshenv।


0

मैं विंडोज से SSH का उपयोग कर एक जिलेटलाइट रेपो से जुड़ने के मुद्दे रहा है और यह पता चला कि मेरी समस्या PLINK थी! यह मुझसे पासवर्ड मांगता रहा, लेकिन ssh gitolite @ [होस्ट] रेपो सूची को ठीक कर देगा।

अपने पर्यावरण चर की जाँच करें: GIT_SSH। यदि यह प्लिन्क पर सेट है, तो इसे बिना किसी मान के आज़माएँ ("GIT_SSH =" सेट करें) और देखें कि क्या काम करता है।


0

git-upload-packदूरस्थ git उपयोगकर्ता .bashrc फ़ाइल में अपने स्थान को जोड़ें ।


0

यह रिमोट होस्ट पर गिट स्थापित करने जैसा सरल हो सकता है (जैसे यह मेरे मामले में था)।

sudo apt-get install git

या अन्य पैकेज प्रबंधन प्रणालियों के लिए समकक्ष।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.