克隆远程Git仓库时找不到git-upload-pack:命令
-
03-07-2019 - |
题
我一直在使用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 = $(git-upload-pack)
命令有效,(并证明 $ PATH
包含根据RTFM解决方案的'git-upload-pack'的路径)但这真的很烦人,加上'git push'不起作用,因为我认为没有 - unpack =
选项。
顺便提一下,所有的git命令都可以从我的本地方框中正常工作,它与软件的同一版本(1.5.4.2)安装在 / usr / local / bin
的同一个NFS挂载上。
有人可以帮忙吗?
解决方案
确保 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
的路径,可以使用此命令找到它(需要在远程计算机上运行):
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's回答,可以通过在克隆后运行以下命令永久地设置upload-pack路径,这样就不需要在后续的pull / fetch请求中使用 - 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
我找到并使用了(成功)此修复程序:
# 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上对我不起作用,但保罗的确如此。
保罗链接的简短版本是:
使用以下文字创建 / 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
(使用Cygwin SSHD的Win XP),这最终修复了它。
我仍然使用MsysGit版本客户端
..实际上,它是唯一可行的方式 对我来说,因为我得到了POSIX错误 Cygwin Git也是如此 sshd服务器
我怀疑Git使用这方面还需要做一些工作.. (ssh +在Windows中轻松拉/推)
就像约翰多次指出它需要的.bashrc一样:
ln -s .bash_profile .bashrc
您必须添加
export PATH=/opt/git/bin:$PATH
在.bashrc中的这一行之前:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
否则所有导出语句都不会被执行(见这里)。
对于zsh,你需要把它放在这个文件中:〜/ .zshenv
例如,在OS X上使用MacPorts的git-core软件包:
$ echo'export PATH = / opt / local / sbin:/ opt / local / bin:$ PATH'> 〜/ .zshenv
我一直在使用Windows从SSH连接到Gitolite repo时遇到问题,结果发现我的问题是PLINK!它一直在问我密码,但ssh giteolite @ [host]会让回购清单恢复正常。
检查您的环境变量:GIT_SSH。如果设置为Plink,则尝试没有任何值(“设置GIT_SSH =”),看看是否有效。
将 git-upload-pack
的位置添加到远程git用户的.bashrc文件中。