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

时间:2008-10-22 11:14:13

标签: git version-control unix ssh

我一直在使用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)相同。

有人可以帮忙吗?

15 个答案:

答案 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* .

感谢Paul Johnston

答案 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

或与其他软件包管理系统等效。