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 mypush
replacegit 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
我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文件中。