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.

(назви файлів змінено для захисту винних ...!)

В обох ящиках працює Solaris 10 AMD. Я зробив декілька копань, якщо я додаю, --upload-pack=$(which git-upload-pack)що команда працює (і доводить, що $PATHмістить шлях до 'git-upload-pack' за рішенням RTFM), але це справді дратує, плюс «git push» не працює, тому що я не думаю, що є --unpack=варіант.

До речі, всі команди git відмінно працюють з моєї локальної скриньки, це та сама версія програмного забезпечення (1.5.4.2), встановлена ​​на тому ж монторі NFS /usr/local/bin.

Хтось може допомогти?

Відповіді:


169

Переконайтеся, що git-upload-packстоїть шлях від оболонки, яка не входить у систему. (На моїй машині він знаходиться /usr/bin).

Щоб побачити, як виглядає ваш шлях на віддаленій машині з оболонки без входу, спробуйте:

ssh you@remotemachine echo \$PATH

(Це працює і в Bash, Zsh, і tcsh, і, мабуть, і в інших оболонках.)

Якщо шлях, який він повертає, не включає каталог, який має git-upload-pack, вам потрібно виправити його, встановивши в .bashrc(для Bash), .zshenv(для Zsh), .cshrc(для tcsh) або еквівалент для вашої оболонки.

Вам потрібно буде зробити цю зміну на віддаленій машині.

Якщо ви не впевнені, який шлях потрібно додати до віддаленого PATHпристрою, ви можете знайти його за допомогою цієї команди (потрібно запустити це на віддаленій машині):

which git-upload-pack

На моїй машині, яка друкує /usr/bin/git-upload-pack. Отже, у цьому випадку, /usr/binшлях, який вам потрібно переконатися, знаходиться у віддаленій оболонці без входу PATH.


2
Шлях був правильним, якщо я запускаю команду на своїй машині, але неправильно, якщо я запускаю її навпаки. (від віддаленої машини назад до шахти) Редагування мого локального .bashrc виправлено. Спасибі
Chris Huang-Leaver

6
Працював на OSX Leopard
Ной Кемпбелл,

1
У моєму випадку команду не знайдено, тому що git був встановлений через MacPorts, який вводить його /opt/local/bin. Додавання цього до моїх .bashrcчерез PATH=$PATH:/new/path/hereпрацював для мене.
Бен Шейрман

1
@ranReloaded Косою косою рискою слід уникнути знака долара та запобігти розширенню $ PATH на локальній машині, а замість цього передати "echo $ PATH" буквально на віддалену машину. Це може залежати від того, яку оболонку ви використовуєте; він працює для мене в zsh і bash. Можливо, ви зможете отримати правильний результат, використовуючи одинарні лапки, наприклад, "ssh you @ remotemachine 'echo $ PATH" "- дай це йти. Інакше яку оболонку ви використовуєте? Можливо, хтось ще використовує цю оболонку і може дати вам вирішення.
Метт Кертіс

3
@ranReloaded: Коли ви говорите "шлях git не надруковано", ви маєте на увазі, що ssh показує багато речей, але не шлях, на який йде git? Якщо так, то у вас є та сама проблема, з якою була в ОП, а використання символьної посилання - лише бандаїд. "ssh .. echo \$PATH" Команда покаже вам шлях на віддалену машині, яка може відрізнятися від вашого входу в шляху, але це важлива річ , щоб отримати право зробити його роботу, і ви можете зробити це, встановивши змінну PATH , щоб включити мерзотник в .bashrcна віддалена машина. За даними сторінки, .profile/ .bash_profileчитаються лише для інтерактивних входів.
Метт Кертіс

66

Ви також можете скористатися параметром "-u", щоб вказати шлях. Я вважаю це корисним на машинах, де мій .bashrc не отримується в неінтерактивних сесіях. Наприклад,

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

2
Дякую за це. Я дійсно не хотів змінювати файл ~ / .bashrc.
Луїс

2
Зазначимо: ось інструкції, як зробити .bashrc отримання джерела на сеансах ssh.
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 можуть бути використані на РЕПО , чиї конфігурації не був змінений , як описано вище , шляхом заміни 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-accept-pack" до шляху в .bashrc, але якимось чином git push все ще не працює для мене, хоча завантаження репо працює добре. Будь-яка ідея, чому це може статися?
coredump

@coredump, налаштування "remote.origin.receivepack" повинно усунути необхідність зміни PATH у вашому .bashrc. Спробуйте git push --receive-pack /full/path/to/git-receive-packсамостійно, налаштовуйте, поки це не вдалося, а потім змініть .git / config (або запустіть "git config"), щоб назавжди встановити шлях отримання пакета.
Гаррет

Дякую всім за відповіді! У моєму випадку сервер отримання та push-сервер були різними, і сервер завантаження не мав дозволів на запис. коли я використовую git push <push-server> <branch>, все працює добре.
coredump


12

Mac OS X та деякі інші Unixes принаймні мають компільований шлях користувача до sshd з міркувань безпеки, тому ті з нас, які встановлюють git як / usr / local / git / {bin, lib, ...}, можуть зіткнутися з проблемою як git виконувані файли не знаходяться в попередньо складеному контурі. Щоб змінити це, я вважаю за краще змінити зміну / etc / sshd_config:

#PermitUserEnvironment no

до

PermitUserEnvironment yes

а потім створіть ~ / .ssh / файли середовища за потребою. Мої користувачі git мають у своєму файлі ~ / .ssh / Environment наступне:

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 / середовище з необхідним шляхом, що не розширюється. Змінено / etc / sshd_config PermitUserEnvironment так. без кісток. Будь-які пропозиції? Дякую.
тато

Також спробував встановити BASH_ENV = '~ / .nibashrc' на клієнтській машині та створити файл у цьому із розширеним шляхом у ньому. також немає кісток.
тато

Гаразд. тому введення шляху в .bashrc на машині, до якої ви підключаєтесь, працював для мене.
тато

дякую за пораду щодо змінної розширення, яка не працює .ssh / середовище
Денис

Оновлення для пояснення того, що розширення var працює.
XMAN

7

Рішення Метта не спрацювало для мене на OS X, але Пол зробив.

Коротка версія посилання на Павла:

Створено /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 / local / bin / ssh_session


Цікаво почути, що це не працювало для вас. Ви не хочете сказати, що було сказано PATH на віддаленій машині, коли ви запустили "ssh you @ remote \ $ PATH"?
Метт Кертіс

7

Для bash його потрібно помістити в .bashrc not .bash_profile (.bash_profile також лише для оболонок входу).


5

Ці помилки я отримав у версії MsysGit.

Дотримуючись всіх порад, які я міг знайти тут і деінде, я закінчився:

встановлення Cygwin версії Git

на сервері (Win XP з Cygwin SSHD), це остаточно виправило.

Я все ще використовую клієнтську частину версії MsysGit

..фактично, це єдиний спосіб, який він працює для мене, оскільки я отримую помилки POSIX при витягуванні Cygwin Git з того самого сервера sshd

Я підозрюю, що якась робота Git все ще потрібна. (Ssh + простота перетягування / натискання в Windows)



1

Ви повинні додати

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

перед цим рядком у .bashrc:

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

Інакше всі заяви про експорт не будуть виконані ( див. Тут ).


1

У мене справа на Win 10 з GIT bash, і я не маю GIT під стандартним розташуванням. Натомість у мене є git under / app / local / bin. Я використовував команди, надані @Garrett, але потрібно змінити шлях, щоб почати з подвійного /:

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

Інакше GIT додасть ваш шлях GIT до Windows спереду.


0

Для zsh потрібно помістити його у цей файл: ~ / .zshenv

Наприклад, в ОС X з використанням пакета git-core від MacPorts:

$ echo 'експортувати PATH = / opt / local / sbin: / opt / local / bin: $ PATH'> ~ / .zshenv


0

У мене виникли проблеми з підключенням до репортажу Gitolite за допомогою SSH з Windows, і виявилося, що моя проблема була PLINK! Просив мене просити пароль, але ssh gitolite @ [хост] поверне список репо-штрафу.

Перевірте змінну середовища: GIT_SSH. Якщо для нього встановлено Plink, спробуйте його без будь-якого значення ("встановити GIT_SSH =") і подивіться, чи це працює.


0

Додайте розташування свого git-upload-packфайлу до файлу .bashrc віддаленого користувача git.


0

Це може бути так само просто, як встановити git на віддалений хост (як це було в моєму випадку).

sudo apt-get install git

Або еквівалент для інших систем управління пакетами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.