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

StackOverflow https://stackoverflow.com/questions/225291

  •  03-07-2019
  •  | 
  •  

Вопрос

Я использую 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 mount в /usr/local/bin.

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

Это было полезно?

Решение

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

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

ssh you@remotemachine echo \$PATH

(Это работает в Bash, Zsh и tcsh, а также, возможно, и в других оболочках.)

Если возвращаемый путь не включает каталог с git-upload-pack , вам нужно исправить это, установив его в .bashrc (для Bash), .zshenv (для Zsh), .cshrc (для tcsh) или эквивалент для вашей оболочки.

Вам нужно будет внести это изменение на удаленном компьютере.

Если вы не уверены, какой путь нужно добавить к удаленному PATH , вы можете найти его с помощью этой команды (вам нужно запустить его на удаленном компьютере):

который git-upload-pack

На моем компьютере печатается / usr / bin / git-upload-pack . Таким образом, в этом случае / usr / bin - это путь, который необходимо указать в удаленной оболочке без регистрации PATH .

Другие советы

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

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

Опираясь на Брайана ответ , путь к выгружаемому пакету можно задать постоянно, выполнив следующие команды после клонирования, что устраняет необходимость в - 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

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

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

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

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

не сработает.

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

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

Принудительная команда /usr/local/bin/ssh_session

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

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

  

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

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

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

  

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

Я подозреваю, что эта сторона Git по-прежнему нужна для работы. (ssh + простота извлечения / нажатия в Windows)

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

ln -s .bash_profile .bashrc

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

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

перед этой строкой в файле .bashrc:

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

В противном случае все инструкции export выполняться не будут (смотрите здесь).

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top