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

Chr*_*ver 169 unix git ssh version-control

我一直在使用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.
Run Code Online (Sandbox Code Playgroud)

(文件名已被更改以保护有罪......!)

两个盒子都运行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.

有人可以帮忙吗?

Mat*_*tis 169

确保git-upload-pack在非登录shell的路径上.(在我的机器上它就在/usr/bin).

要从非登录shell查看远程计算机上的路径,请尝试以下操作:

ssh you@remotemachine echo \$PATH
Run Code Online (Sandbox Code Playgroud)

(适用于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.

  • 致力于OSX Leopard (6认同)
  • @ranReloaded:当你说"没有打印git路径"时,你是说ssh显示了很多东西但不是git所在的路径?如果是这样,那么你就会遇到与OP相同的问题,并且使用符号链接只是一个绑带.`ssh .. echo\$ PATH"`命令将显示远程计算机上的路径,这可能与您的登录路径不同,但这是正确使其正常工作的关键所在,您可以执行此操作通过设置PATH将git包含在远程机器上的`.bashrc`中.根据联机帮助页,只有交互式登录才能读取.profile` /`.bash_profile`. (3认同)
  • 如果我在我的机器上运行命令,路径是正确的,但如果我以相反的方式运行它,则错误.(从远程机器回到我的)编辑我的本地.bashrc修复它.谢谢 (2认同)

Bri*_*ins 66

您还可以使用"-u"选项指定路径.我发现这对我的.bashrc不会在非交互式会话中获取的机器很有用.例如,

git clone -u /home/you/bin/git-upload-pack you@machine:code
Run Code Online (Sandbox Code Playgroud)

  • 感谢那.我真的不想改变〜/ .bashrc文件. (2认同)
  • 需要注意的是:[这里](http://stackoverflow.com/questions/820517/bashrc-at-ssh-login)是关于如何使.bashrc在ssh会话上获取的说明. (2认同)

Gar*_*ett 56

基于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
Run Code Online (Sandbox Code Playgroud)

这两个命令相当于将以下行添加到repo中.git/config.

[remote "origin"]
    uploadpack = /path/to/git-upload-pack
    receivepack = /path/to/git-receive-pack
Run Code Online (Sandbox Code Playgroud)

频繁的用户clone -u可能对以下别名感兴趣.myclone应该是不言自明的.myfetch/mypull/mypush可以在其回购配置为通过替换上述没有被修改被用于git pushgit 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
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 30

我发现并使用(成功)此修复程序:

# Fix it with symlinks in /usr/bin
$ cd /usr/bin/
$ sudo ln -s /[path/to/git]/bin/git* .
Run Code Online (Sandbox Code Playgroud)

感谢Paul Johnston.

  • 在OSX上为我工作,他通过macports安装了git (2认同)

小智 12

出于安全原因,Mac OS X和其他一些Unix至少将用户路径编译成sshd,因此我们这些将git安装为/ usr/local/git/{bin,lib,...}的人会因为git而遇到麻烦可执行文件不在预编译路径中.要覆盖它,我更喜欢编辑我的/ etc/sshd_config更改:

#PermitUserEnvironment no
Run Code Online (Sandbox Code Playgroud)

PermitUserEnvironment yes
Run Code Online (Sandbox Code Playgroud)

然后根据需要创建〜/ .ssh/environment文件.我的git用户在他们的〜/ .ssh/environment文件中有以下内容:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin
Run Code Online (Sandbox Code Playgroud)

注意读取〜/ .ssh/environment文件时不会发生变量扩展:

PATH=$PATH:/usr/local/git/bin
Run Code Online (Sandbox Code Playgroud)

不管用.


小智 7

对于bash,需要将其放入.bashrc而不是.bash_profile(.bash_profile也仅用于登录shell).


Ske*_*ron 6

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
Run Code Online (Sandbox Code Playgroud)

执行:

chmod +x /usr/local/bin/ssh_session

将以下内容添加到/etc/sshd_config:

ForceCommand/usr/local/bin/ssh_session


Ric*_*kyo 5

我在MsysGit版本中遇到了这些错误.

按照我在这里和其他地方找到的所有建议后,我最终:

安装Cygwin版本的Git

在服务器上(Win XP与Cygwin SSHD),这最终解决了它.

我仍然使用MsysGit版本的客户端

..实际上,这是它对我有用的唯一方式,因为我从同一个sshd服务器获取了Cygwin Git的POSIX错误

我怀疑Git使用的这方面仍然需要一些工作..(ssh +在Windows中轻松拉/推)