git-upload-pack : 원격 Git 저장소를 복제 할 때 명령을 찾을 수 없습니다


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하고 RTFM 솔루션에 따라 'git-upload-pack'에 대한 경로 가 포함되어 있음을 증명 하면 약간의 파기를 수행 했지만 실제로는 성 가시고 'git push'가 작동하지 않습니다. --unpack=옵션 이 없다고 생각하기 때문입니다 .

또한 모든 git 명령은 로컬 상자에서 제대로 작동하며 동일한 NFS 마운트에 설치된 동일한 버전의 소프트웨어 (1.5.4.2) /usr/local/bin입니다.

아무도 도와 줄 수 있습니까?

답변:


169

git-upload-pack비 로그인 쉘의 경로에 있는지 확인하십시오 . (내 컴퓨터에서는에 있습니다 /usr/bin).

비 로그인 쉘에서 원격 시스템의 경로를 보려면 다음을 수행하십시오.

ssh you@remotemachine echo \$PATH

Bash, Zsh 및 tcsh 및 다른 쉘에서도 작동합니다.

제공하는 경로에가있는 디렉토리가 포함되어 있지 않으면 (Bash), (Zsh), (tcsh) 또는 쉘에 해당 하는 디렉토리 git-upload-pack로 설정하여 수정해야합니다 ..bashrc.zshenv.cshrc

원격 시스템에서이 변경을 수행해야합니다.

remote에 추가해야 할 경로가 확실하지 않은 경우 다음 PATH명령을 사용하여 찾을 수 있습니다 (원격 시스템에서이 경로를 실행해야 함).

which git-upload-pack

내 컴퓨터에서 인쇄합니다 /usr/bin/git-upload-pack. 따라서이 경우 /usr/bin원격 비 로그인 쉘에 있는지 확인해야합니다 PATH.


2
내 컴퓨터에서 명령을 실행하면 경로가 정확했지만 다른 방법으로 실행하면 잘못되었습니다. (원격 컴퓨터에서 광산으로) 로컬 .bashrc를 수정하면 문제가 해결되었습니다. 감사합니다
Chris Huang-Leaver

6
OSX Leopard에서 작업
Noah Campbell

1
필자의 경우 git이 MacPorts를 통해 설치되어 명령을 찾지 못했습니다 /opt/local/bin. 내 .bashrcvia에 이것을 추가하면 PATH=$PATH:/new/path/here나를 위해 일했습니다.
Ben Scheirman

1
@ranReloaded 백 슬래시는 달러 기호를 이스케이프하고 로컬 시스템에서 $ PATH의 확장을 막고 대신 "echo $ PATH"를 원격 시스템으로 전달합니다. 사용중인 쉘에 따라 다를 수 있습니다. 그것은 zsh와 bash에서 나를 위해 작동합니다. 작은 따옴표를 사용하여 올바른 결과를 얻을 수 있습니다 (예 : "ssh you @ remotemachine 'echo $ PATH'"). 그렇지 않으면 어떤 쉘을 사용하고 있습니까? 어쩌면 여기 다른 누군가가 그 껍질을 사용하고 해결 방법을 제공 할 수 있습니다.
매트 커티스

3
@ranReloaded : "git path가 인쇄되지 않았다"고 말할 때, ssh에 많은 것들이 있지만 git가있는 경로는 표시되지 않습니까? 그렇다면 OP와 동일한 문제가 있으며 심볼릭 링크를 사용하는 것은 반창고입니다. 이 "ssh .. echo \$PATH" 명령은 로그인 경로와 다를 수있는 원격 시스템의 경로를 보여 주지만 이것이 올바르게 작동하도록하는 데 중요한 역할 .bashrc을합니다. 원격 기계. 맨 페이지에 따르면 .profile/ .bash_profile는 대화 형 로그인에 대해서만 읽습니다.
매트 커티스

66

"-u"옵션을 사용하여 경로를 지정할 수도 있습니다. 내 .bashrc가 비 대화 형 세션에서 소스되지 않는 컴퓨터에서 이것이 도움이된다는 것을 알았습니다. 예를 들어

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

2
고마워 ~ / .bashrc 파일을 변경하고 싶지 않았습니다.
Luis

2
그냥 참고 : 여기에 SSH 세션에 공급받을 .bashrc에 확인하는 방법에 대한 지침입니다.
sp3ctum

58

Brian의 답변을 바탕으로 , 복제 후 다음 명령을 실행하여 업로드 팩 경로를 영구적으로 설정할 수 있으므로 --upload-pack후속 풀 / 페치 요청이 필요하지 않습니다. 마찬가지로 수신 팩을 설정하면 --receive-pack푸시 요청 이 필요하지 않습니다.

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

이 두 명령은 다음 행을 repo 's에 추가하는 것과 같습니다 .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

--receive-pack옵션을 언급 해 주셔서 감사 합니다 git-push!
악셀

1
구성 옵션에 대해 언급 해 주셔서 감사합니다. 이는 사용자 공간에서 유용한 정보입니다.
Aron Ahmadia

귀하의 제안을 시도하고 .bashrc의 경로에 "git-receive-pack"을 추가했지만 repo 업로드가 제대로 작동하지만 git push가 여전히 작동하지 않습니다. 왜 이런 일이 일어날 수 있는지 아십니까?
coredump

@coredump에서 "remote.origin.receivepack"을 설정하면 .bashrc에서 PATH를 수정하지 않아도됩니다. git push --receive-pack /full/path/to/git-receive-pack자체적으로 시도 하고 성공할 때까지 조정 한 다음 .git / config를 수정하거나 "git config"를 실행하여 receive-pack 경로를 영구적으로 설정하십시오.
Garrett

답변 해 주셔서 감사합니다. 필자의 경우 가져 오기 서버와 푸시 서버가 다르고 가져 오기 서버에 쓰기 권한이 없습니다. git push <push-server> <branch>를 사용하면 모든 것이 잘 작동합니다.
coredump

30

이 수정 프로그램을 찾아서 성공적으로 사용했습니다.

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

Paul Johnston 에게 감사합니다 .


나를 위해 고정되었습니다. 감사!
John Ballinger

12

Mac OS X과 다른 유닉스는 보안상의 이유로 적어도 sshd로 컴파일 된 사용자 경로를 가지고 있으므로 git를 / usr / local / git / {bin, lib, ...}로 설치하는 사람들은 git으로 문제를 일으킬 수 있습니다. 실행 파일이 사전 컴파일 된 경로에 없습니다. 이것을 무시하려면 / etc / sshd_config 변경을 편집하는 것이 좋습니다.

#PermitUserEnvironment no

PermitUserEnvironment yes

필요에 따라 ~ / .ssh / environment 파일을 만듭니다. 내 자식 사용자는 ~ / .ssh / environment 파일에 다음이 있습니다.

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

~ / .ssh / environment 파일을 읽을 때 변수 확장이 발생하지 않습니다.

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

작동 안 할 것이다.


이것은 완벽한 팁처럼 보이지만 10.6.6에서는 작동하지 않습니다. ssh user @ host echo \ $ PATH는 여전히 하드 코딩 된 빌드 경로를 보여줍니다. 비 확장 필수 경로로 .ssh / environment를 추가했습니다. / etc / sshd_config PermitUserEnvironment가 변경되었습니다. 주사위가 없습니다. 어떤 제안? 감사.
아빠

또한 클라이언트 시스템에서 BASH_ENV = '~ / .nibashrc'를 설정하고 확장 경로가있는 파일을 만들어보십시오. 주사위도 없습니다.
아빠

확인. 그래서 연결하려는 컴퓨터의 .bashrc에 경로를 넣으면 나를 위해 일했습니다.
아빠

.ssh / environment에서 작동하지 않는 변수 확장에 대한 팁에 감사드립니다
Denis

var 확장이 작동한다고 설명합니다.
XMAN

7

Matt의 솔루션은 OS X에서 저에게 효과가 없었지만 Paul은 해결책이 없었습니다.

Paul의 링크에서 짧은 버전은 다음과 같습니다.

/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


듣기에 흥미롭지 않았다. "ssh you @ remote \ $ PATH"를 실행할 때 원격 시스템의 PATH가 무엇이라고 말했습니까?
매트 커티스

7

bash의 경우 .bash_profile이 아닌 .bashrc에 넣어야합니다 (.bash_profile은 로그인 쉘 전용입니다).


5

MsysGit 버전에서 이러한 오류가 발생했습니다.

나는 여기와 다른 곳에서 찾을 수있는 모든 조언을 따랐다.

Cygwin 버전의 Git 설치

서버 (Cygwin SSHD가 포함 된 Win XP)에서 마침내 수정되었습니다.

여전히 MsysGit 버전 클라이언트 측을 사용합니다.

.. 사실, 동일한 sshd 서버에서 Cygwin Git 풀에 POSIX 오류가 발생하기 때문에 저에게 유일한 방법입니다.

나는 Git 사용 의이 측면에서 여전히 약간의 작업이 필요하다고 생각한다.



1

당신은 추가해야합니다

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

.bashrc 에서이 줄 앞에 :

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

그렇지 않으면 모든 내보내기 문이 실행되지 않습니다 ( 여기 참조 ).


1

내 경우는 GIT bash와 함께 Win 10에 있으며 표준 위치에 GIT이 없습니다. 대신 / app / local / bin 아래에 자식이 있습니다. @Garrett에서 제공 한 명령을 사용했지만 double /로 시작하도록 경로를 변경해야합니다.

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

그렇지 않으면 GIT가 Windows GIT 경로를 앞에 추가합니다.


0

zsh의 경우 ~ / .zshenv 파일에 넣어야합니다.

예를 들어, MacPorts의 git-core 패키지를 사용하는 OS X의 경우 :

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


0

Windows에서 SSH를 사용하여 Gitolite 저장소에 연결하는 데 문제가 있으며 내 문제는 PLINK였습니다. 암호를 묻는 메시지가 계속 표시되었지만 ssh gitolite @ [host]는 repo 목록을 올바르게 반환합니다.

환경 변수 GIT_SSH를 확인하십시오. Plink로 설정되어 있으면 값없이 ( "set GIT_SSH =") 시도하고 작동하는지 확인하십시오.


0

git-upload-pack원격 위치 사용자의 .bashrc 파일에 위치를 추가 하십시오.


0

원격 호스트에 git을 설치하는 것만 큼 간단합니다 (필자의 경우와 같음).

sudo apt-get install git

또는 다른 패키지 관리 시스템과 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.