我一直在使用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
.
有人可以帮忙吗?
确保git-upload-pack
在非登录shell的路径上.(在我的机器上它就在/usr/bin
).
要从非登录shell查看远程计算机上的路径,请尝试以下操作:
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
.
您还可以使用"-u"选项指定路径.我发现这对我的.bashrc不会在非交互式会话中获取的机器很有用.例如,
git clone -u /home/you/bin/git-upload-pack you@machine:code
基于Brian的回答,可以通过在克隆之后运行以下命令来永久地设置上载包路径,这消除了--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
这两个命令相当于将以下行添加到repo中.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* .
感谢Paul Johnston.
出于安全原因,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也仅用于登录shell).
Matt的解决方案在OS X上对我不起作用,但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
我在MsysGit版本中遇到了这些错误.
按照我在这里和其他地方找到的所有建议后,我最终:
安装Cygwin版本的Git
在服务器上(Win XP与Cygwin SSHD),这最终解决了它.
我仍然使用MsysGit版本的客户端
..实际上,这是它对我有用的唯一方式,因为我从同一个sshd服务器获取了Cygwin Git的POSIX错误
我怀疑Git使用的这方面仍然需要一些工作..(ssh +在Windows中轻松拉/推)