it-swarm.com.ru

git-upload-pack: команда не найдена, при клонировании удаленного репозитория Git

Я использовал git для синхронизации двух копий моего проекта, один из них - мой локальный блок, другой - тестовый сервер. Эта проблема возникает, когда я захожу на наш удаленный сервер разработки с использованием ssh;

git clone [email protected]:/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 '[email protected]:/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.

Кто-нибудь может помочь?

168
Chris Huang-Leaver

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

Чтобы увидеть, как выглядит ваш путь на удаленной машине из командной консоли без регистрации, попробуйте следующее:

ssh [email protected] 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.

168
Matt Curtis

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

git clone -u /home/you/bin/git-upload-pack [email protected]:code
66
Brian Hawkins

Опираясь на ответ Брайана , путь к выгружаемому пакету можно установить постоянно, выполнив следующие команды после клонирования, что устраняет необходимость в --upload-pack при последующих запросах извлечения/извлечения. Аналогично, настройка receive-pack устраняет необходимость в --receive-pack для Push-запросов.

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 могут быть заинтересованы в следующих псевдонимах. Myclone должен быть самоочевидным. 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
56
Garrett

Я нашел и использовал (успешно) это исправление:

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

Благодаря Пол Джонстон .

30
Andy

В Mac OS X и некоторых других Unix по крайней мере пользовательский путь компилируется в sshd по соображениям безопасности, поэтому те из нас, кто устанавливает git как/usr/local/git/{bin, lib, ...}, могут столкнуться с проблемами в качестве git исполняемые файлы не находятся в предварительно скомпилированном пути. Чтобы отменить это, я предпочитаю изменить мой/etc/sshd_config, изменив:

#PermitUserEnvironment no

в

PermitUserEnvironment yes

и затем создайте файлы ~/.ssh/environment по мере необходимости. Мои пользователи git имеют в своем файле ~/.ssh/environment следующее:

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

Обратите внимание, что расширение переменной не происходит, когда файл ~/.ssh/environment читается так:

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

не будет работать.

11
tom

Для bash его нужно поместить в .bashrc, а не .bash_profile (.bash_profile также только для оболочек входа в систему).

7
Johan Almqvist

Решение Мэтта не работает для меня на 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

6
Skeletron

Я получил эти ошибки с версией MsysGit.

Следуя всем советам, которые я мог найти здесь и в другом месте, я оказался:

установка Cygwin-версии Git

на сервере (Win XP с Cygwin SSHD) это наконец исправило.

Я все еще использую версию клиента MsysGit

... на самом деле, это единственный способ, которым он работает для меня, так как я получаю ошибки POSIX при использовании Cygwin Git pull с того же сервера sshd

Я подозреваю, что в этой части использования Git все еще требуется некоторая работа (ssh + легкость извлечения/Push в Windows)

5
Ric Tokyo

Как Йохан много раз указывал на его .bashrc, который нужен:

ln -s .bash_profile .bashrc

1
Stefan Lundström

Вы должны добавить

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

перед этой строкой в ​​.bashrc:

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

В противном случае все операторы экспорта не будут выполнены ( см. Здесь ).

1
Dennis

У меня были проблемы с подключением к репозиторию Gitolite с использованием SSH из Windows, и оказалось, что моя проблема была PLINK! Он продолжал спрашивать у меня пароль, но ssh gitolite @ [Host] вернул бы список репо в порядке.

Проверьте переменную среды: GIT_SSH. Если он установлен на Plink, попробуйте его без какого-либо значения ("set GIT_SSH =") и посмотрите, работает ли это.

0
RAVolt

Для zsh вы должны поместить его в этот файл: ~/.zshenv

Например, в OS X с использованием пакета git-core от MacPorts:

$ echo 'export PATH =/opt/local/sbin:/opt/local/bin: $ PATH'> ~/.zshenv

0
miknight

Добавьте местоположение вашего git-upload-pack в файл .bashrc удаленного пользователя git.

0
Yeison