我一直在使用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命令都可以从我的本地方框中正常工作,它与安装在/usr/local/bin
的同一NFS挂载上的软件版本(1.5.4.2)相同。
有人可以帮忙吗?
答案 0 :(得分:168)
确保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
中的路径。
答案 1 :(得分:66)
您还可以使用“-u”选项指定路径。我发现这对我的.bashrc不会在非交互式会话中获取的机器很有用。例如,
git clone -u /home/you/bin/git-upload-pack you@machine:code
答案 2 :(得分:56)
在Brian's answer上构建,可以通过在克隆之后运行以下命令来永久设置upload-pack路径,从而消除了对后续拉取/获取请求--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可用于其配置未经如上所述修改的repos,将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
答案 3 :(得分:30)
我找到并使用了(成功)此修复程序:
# Fix it with symlinks in /usr/bin
$ cd /usr/bin/
$ sudo ln -s /[path/to/git]/bin/git* .
答案 4 :(得分:11)
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
无效。
答案 5 :(得分:7)
对于bash,它需要放入.bashrc而不是.bash_profile(.bash_profile也只适用于登录shell)。
答案 6 :(得分:6)
Matt的解决方案在OS X上对我不起作用,但保罗的确如此。
保罗链接的简短版本是:
使用以下文字创建/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
答案 7 :(得分:5)
我在MsysGit版本中遇到了这些错误。
在遵循我在这里和其他地方找到的所有建议后,我最终:
服务器上的安装Cygwin版本的Git
(使用Cygwin SSHD的Win XP),这最终修复了它。
我仍然使用MsysGit版本客户端
事实上,它是唯一可行的方式 对我来说,因为我得到了POSIX错误 Cygwin Git也是如此 sshd服务器
我怀疑Git使用这方面还需要做一些工作.. (ssh +在Windows中轻松拉/推)
答案 8 :(得分:1)
就像约翰多次指出它需要的.bashrc一样:
ln -s .bash_profile .bashrc
答案 9 :(得分:1)
您必须添加
export PATH=/opt/git/bin:$PATH
在.bashrc中的这一行之前:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
否则所有导出语句都不会被执行(see here)。
答案 10 :(得分:0)
对于zsh,你需要把它放在这个文件中:〜/ .zshenv
例如,在OS X上使用MacPorts的git-core软件包:
$ echo'export PATH = / opt / local / sbin:/ opt / local / bin:$ PATH'> 〜/ .zshenv
答案 11 :(得分:0)
我一直在使用Windows从SSH连接到Gitolite repo时遇到问题,结果发现我的问题是PLINK!它一直在问我密码,但ssh giteolite @ [host]会让回购清单恢复正常。
检查您的环境变量:GIT_SSH。如果设置为Plink,则尝试没有任何值(“设置GIT_SSH =”)并查看是否有效。
答案 12 :(得分:0)
将git-upload-pack
的位置添加到远程git用户的.bashrc文件中。
答案 13 :(得分:0)
我的案子是在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路径。
答案 14 :(得分:0)
就像在远程主机上安装git一样简单(就像我的情况一样)。
sudo apt-get install git
或与其他软件包管理系统等效。