代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver

git upload pack:克隆远程git repo时找不到命令

  •  168
  • Chris Huang-Leaver  · 技术社区  · 16 年前

    我一直在使用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 包含“git upload pack”的路径(根据rtfm解决方案),但这确实很烦人,加上“git push”不起作用,因为我认为没有 --unpack= 选择权。

    顺便说一句,所有的git命令在我的本地设备上都可以正常工作,它是安装在同一个nfs挂载上的同一个软件版本(1.5.4.2)。 /usr/local/bin .

    有人能帮忙吗?

    13 回复  |  直到 7 年前
        1
  •  167
  •   Matt Curtis    12 年前

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

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

    ssh you@remotemachine echo \$PATH
    

    (这在bash、zsh和tcsh中有效,也可能在其他shell中有效。)

    如果它返回的路径不包括 Git上传包 ,您需要通过将其设置为 .bashrc (巴什) .zshenv (对于ZSH) .cshrc (对于TCSH)或与之相当的外壳。

    您需要在远程计算机上进行此更改。

    如果不确定要添加到远程服务器的路径 PATH ,您可以使用此命令找到它(需要在远程计算机上运行此命令):

    which git-upload-pack

    在我的机器上打印 /usr/bin/git-upload-pack . 所以在这种情况下, /UR/bin 您需要确定的路径是否在远程非登录shell中 路径 .

        2
  •  66
  •   Brian Hawkins    15 年前

    也可以使用“-u”选项指定路径。我发现这在我的.bashrc无法在非交互会话中获得源代码的机器上很有用。例如,

    git clone -u /home/you/bin/git-upload-pack you@machine:code
    
        3
  •  56
  •   Community CDub    8 年前

    建立在 Brian's answer ,可以通过在克隆后运行以下命令永久设置上载包路径,从而消除了 --upload-pack 在随后的拉/取请求中。同样,设置接收包也不需要 --receive-pack 推送请求。

    git config remote.origin.uploadpack /path/to/git-upload-pack
    git config remote.origin.receivepack /path/to/git-receive-pack
    

    这两个命令相当于向回购协议添加以下行 .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
    
        4
  •  30
  •   Andy    16 年前

    我找到并成功使用了此修复程序:

    # Fix it with symlinks in /usr/bin
    $ cd /usr/bin/
    $ sudo ln -s /[path/to/git]/bin/git* .
    

    多亏了 Paul Johnston .

        5
  •  11
  •   tom    15 年前

    Mac OS X和其他一些Unix至少出于安全原因将用户路径编译为sshd,因此安装git as/usr/local/git/bin、lib,…的用户可能会遇到问题,因为git可执行文件不在预编译路径中。要覆盖此选项,我更喜欢编辑/etc/sshd_配置更改:

    #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
    

    不会起作用。

        6
  •  7
  •   Andrew Grimm atk    12 年前

    对于bash,需要将其放入.bashrc而不是.bash_概要文件(.bash_概要文件也仅用于登录shell)。

        7
  •  6
  •   Skeletron    16 年前

    Matt的解决方案在OSX上对我不起作用,但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_会话

        8
  •  5
  •   Ric Tokyo    16 年前

    我在msysgit版本中发现了这些错误。

    在遵循我在这里和其他地方所能找到的所有建议之后,我最终:

    安装Git的Cygwin版本

    在服务器上(win xp和cygwin sshd),这最终修复了它。

    我仍然使用msysgit版本客户端

    …事实上,这是它唯一的工作方式 对我来说,因为我在 Cygwin Git从同一个 SSHD服务器

    我怀疑在Git使用的这方面仍然需要一些工作。 (ssh+易于拉入/推入窗口)

        9
  •  1
  •   Stefan Lundström    16 年前

    就像Johan多次指出的那样,bashrc需要:

    ln-s.bash_配置文件.bashrc

        10
  •  1
  •   Community CDub    8 年前

    您必须添加

    export PATH=/opt/git/bin:$PATH
    

    在.bashrc中的此行之前:

    # If not running interactively, don't do anything
    [ -z "$PS1" ] && return
    

    否则将不执行所有导出语句( see here )

        11
  •  0
  •   miknight    15 年前

    对于zsh,您需要将其放入此文件:~/.zshenv

    例如,在使用MacPorts的Git核心包的OS X上:

    $echo'导出路径=/opt/local/sbin:/opt/local/bin:$path'>~/.zshenv

        12
  •  0
  •   RAVolt    13 年前

    我在使用Windows的ssh连接Gitolite回购时遇到问题,结果发现我的问题是plink!它一直要求我输入密码,但是ssh gitolite@[host]会返回repo列表。

    检查您的环境变量:git_ssh。如果它被设置为plink,那么在没有任何值(“set git_ssh=”)的情况下尝试它,看看是否有效。

        13
  •  0
  •   Yeison    12 年前

    添加您的位置 git-upload-pack 到远程git用户的.bashrc文件。