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命令都可以在我的本地机器上正常工作,它是该软件的相同版本(1.5.4.2),安装在的同一NFS挂载上/usr/local/bin

有人可以帮忙吗?

Answers:


169

确保git-upload-pack位于非登录外壳程序的路径上。(在我的机器上/usr/bin)。

要从非登录外壳查看远程计算机上的路径,请尝试以下操作:

ssh you@remotemachine echo \$PATH

(这适用于Bash,Zsh和tcsh,也可能适用于其他shell。)

如果返回的路径不包含具有的目录,则git-upload-pack需要通过将其设置为.bashrc(对于Bash),.zshenv(对于Zsh),.cshrc(对于tcsh)或等效于shell 来对其进行修复。

您将需要在远程计算机上进行此更改。

如果不确定要添加到远程的路径PATH,可以使用以下命令找到它(您需要在远程计算机上运行该路径):

which git-upload-pack

在我的机器上打印/usr/bin/git-upload-pack。因此,在这种情况下,/usr/bin您需要确保的路径是在远程非登录shell中PATH


2
如果我在计算机上运行该命令,则该路径是正确的,但如果以其他方式运行该命令,则该路径是错误的。(从远程计算机回到我的)编辑我的本地.bashrc修复了它。谢谢
克里斯·黄·利弗

6
在OSX Leopard上工作
Noah Campbell,2009年

1
在我的情况下,找不到命令,因为git是通过MacPorts安装的,并将其放入/opt/local/bin。将此添加到我的过.bashrc孔中PATH=$PATH:/new/path/here对我有用。
Ben Scheirman

1
@ranReloaded反斜杠应该转义美元符号并防止$ PATH在本地计算机上扩展,而是将“ echo $ PATH”从字面上传递给远程计算机。这可能取决于您所使用的外壳。它在zsh和bash中对我有效。您可能可以使用单引号获得正确的结果,例如“ ssh you @ remotemachine'echo $ PATH'”-试试吧。否则,您使用什么外壳?也许这里的其他人使用了该Shell,可以为您提供解决方法。
马特·柯蒂斯

3
@ranReloaded:当您说“未打印git路径”时,您的意思是ssh显示了很多东西,但git不在的路径吗?如果是这样,那么您将遇到与OP相同的问题,并且使用符号链接只是一个创可贴。该"ssh .. echo \$PATH" 命令将向您显示远程计算机上的路径,该路径可能与您的登录路径不同,但这是使它正常运行的关键,您可以通过将PATH设置为在.bashrc上将git包括在内远程机器。根据手册页,.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

Brian的答案的基础上,可以在克隆后通过运行以下命令来永久设置upload-pack路径,从而无需进行--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可能对以下别名感兴趣。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
Axel

1
感谢您提到配置选项,这是用户空间的有用之处。
阿隆·艾玛迪亚

我尝试了您的建议,还在.bashrc中的路径中添加了“哪一个git-receive-pack”,但尽管回购上传工作正常,但git push仍然对我不起作用。知道为什么会发生这种情况吗?
coredump 2012年

@coredump,设置“ remote.origin.receivepack”应消除在.bashrc中修改PATH的需要。git push --receive-pack /full/path/to/git-receive-pack自己尝试,进行调整直到成功,然后修改.git / config(或运行“ git config”)以永久设置接收包路径。
加勒特2012年

感谢大家的回应!在我的情况下,提取服务器和推送服务器不同,并且提取服务器没有写权限。当我使用git push <push-server> <branch>时,一切正常。
coredump 2012年

30

我找到并成功使用了此修复程序:

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

感谢Paul Johnston


也为我修复。谢谢!
约翰·巴林格

12

出于安全原因,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

不管用。


这似乎是一个完美的技巧,但对于10.6.6而言,此技巧无效。ssh user @ host echo \ $ PATH仍显示硬编码的构建路径。添加了.ssh / environment且未扩展所需路径。更改了/ etc / sshd_config PermitUserEnvironment是。没有骰子。有什么建议?谢谢。
爸爸

还尝试在客户端计算机上设置BASH_ENV ='〜/ .nibashrc'并在其中创建包含扩展路径的文件。也没有骰子。
爸爸

好。所以将路径放在您要连接的计算机上的.bashrc中对我来说很有效。
爸爸

感谢有关变量扩展不适用于.ssh / environment的提示
Denis 2015年

赞成解释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,需要将其放入.bashrc中,而不是.bash_profile中(.bash_profile也仅用于登录Shell)。


5

我在MsysGit版本中遇到了这些错误。

在听完我在这里和其他地方可以找到的所有建议之后,我结束了:

安装Cygwin版本的Git

在服务器上(带有Cygwin SSHD的Win XP),最终将其修复。

我仍然使用MsysGit版本的客户端

..实际上,这是对我有用的唯一方法,因为我从同一台sshd服务器上收到的Cygwin Git拉动出现POSIX错误

我怀疑在Git使用的这一方面仍需要做一些工作。(在Windows中使用ssh + push / push轻松)



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。相反,我在/ app / local / bin下有git。我使用了@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

例如,在OS X上,使用MacPorts的git-core软件包:

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


0

我在Windows上使用SSH连接到Gitolite存储库时遇到了问题,事实证明我的问题是PLINK!它一直要求我提供密码,但是ssh gitolite @ [host]会很好地返回存储库列表。

检查您的环境变量:GIT_SSH。如果将其设置为Plink,则尝试不使用任何值(“ set GIT_SSH =”),然后查看是否可行。


0

将您的位置添加git-upload-pack到远程git用户的.bashrc文件。


0

就像在远程主机上安装git一样简单(就像我的情况一样)。

sudo apt-get install git

或等效于其他程序包管理系统。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.