git-upload-pack:在克隆远程Git仓库时找不到命令

我一直在使用git来保持项目的两个副本同步,一个是我的本地框,另一个是testing服务器。 这是使用sshlogin到远程开发服务器时发生的问题;

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)该命令的作品,(并certificate$PATH包含path'git上传包'按照RTFM解决scheme)但这真的很烦人,再加上“混帐推”不起作用,因为我不认为有一个--unpack=选项。

顺便说一下,所有的git命令都可以在我的本地机器上正常工作,它与安装在/usr/local/bin NFS挂载点上的软件版本(1.5.4.2)相同。

任何人都可以帮忙吗?

确保git-upload-pack位于非loginshell的path上。 (在我的机器上它在/usr/bin )。

要从非loginshell中查看远程机器上的path,请尝试以下操作:

 ssh you@remotemachine echo \$PATH 

(在Bash,Zsh和tcsh中,也可能是其他的shell。)

如果它返回的path不包含具有git-upload-pack的目录,则需要通过设置.bashrc (用于Bash) .zshenv (用于Zsh) .zshenv .cshrc (用于tcsh)或相当于你的shell。

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

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

which git-upload-pack

在我的机器上打印/usr/bin/git-upload-pack 。 所以在这种情况下, /usr/bin是您需要确保在远程非loginshell PATH

您也可以使用“-u”选项来指定path。 我发现这有助于我的.bashrc不在非交互式会话中获取的计算机。 例如,

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

基于Brian的回答 ,可以通过在克隆之后运行以下命令来永久地设置上载包path,这消除了在随后的取/取请求上的--upload-pack的需要。 同样,设置接收包--receive-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添加到repo的.git/config

 [remote "origin"] uploadpack = /path/to/git-upload-pack receivepack = /path/to/git-receive-pack 

clone -u频繁用户可能对以下别名感兴趣。 myclone应该是不言自明的。 myfetch / mypull / mypush可以用于repos,其configuration没有像上面描述的那样通过用git mypushreplacegit pushgit 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 

我find并使用(成功)此修复程序:

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

感谢Paul Johnston 。

Mac OS X和一些其他的Unix至less有用户path编译为sshd出于安全的原因,所以我们这些安装git / usr / local / git / {bin,lib,…}可能会遇到麻烦作为git可执行文件不在预编译path中。 重写这个我更喜欢编辑我的/ etc / sshd_config改变:

 #PermitUserEnvironment no 

 PermitUserEnvironment yes 

然后根据需要创build〜/ .ssh / environment文件。 我的git用户在〜/ .ssh / environment文件中有以下内容:

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

注意〜/ .ssh / environment文件被读取时不会发生variables扩展:

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

不pipe用。

对于bash,它需要被放入.bashrc而不是.bash_profile(.bash_profile也仅适用于loginshell)。

Matt的解决scheme在OS X上并不适用于我,但Paul的确如此。

保罗链接的简短版本是:

使用以下文本创build/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

我有MsysGit版本的这些错误。

按照我在这里和其他地方find的所有build议,我结束了:

安装Git的Cygwin版本

在服务器上(Win XP与Cygwin SSHD),这个终于修复了。

我仍然使用MsysGit版本客户端

事实上,它是唯一的方式,它为我工作,因为我得到同一个sshd服务器的Cygwin Git拉POSIX错误

我怀疑有一些工作仍然需要Git使用..(ssh +在Windows中简单的拉/推)

和Johan一样,他多次指出了它所需要的.bashrc:

ls -b .bash_profile .bashrc

您必须添加

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

在.bashrc中的这行之前:

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

否则,所有的导出语句都不会被执行( 见这里 )。

对于zsh,你需要把它放在这个文件中:〜/ .zshenv

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

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

我一直有问题连接到一个Gitolite回购从Windows使用SSH,事实certificate,我的问题是PLINK! 它一直在问我一个密码,但SSH gitolite @ [主机]将返回回购清单罚款。

检查你的环境variables:GIT_SSH。 如果它设置为Plink,然后尝试没有任何价值(“设置GIT_SSH =”),看看是否有效。

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