【问题标题】:git-upload-pack: command not found, when cloning remote Git repogit-upload-pack:克隆远程 Git 存储库时找不到命令
【发布时间】:2010-09-18 12:36:32
【问题描述】:

我一直在使用 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 命令在我的本地机器上都可以正常工作,它是相同版本的软件 (1.5.4.2),安装在同一 NFS 挂载 /usr/local/bin

有人可以帮忙吗?

【问题讨论】:

标签: git version-control unix ssh


【解决方案1】:

这可能就像在远程主机上安装 git 一样简单(就像我的情况一样)。

sudo apt-get install git

或其他包管理系统的等效项。

【讨论】:

    【解决方案2】:

    我的案例是在 Win 10 上使用 GIT bash 并且我在标准位置下没有 GIT。相反,我在 /app/local/bin 下有 git。 我使用了@Garrett提供的命令,但需要更改路径以双/开头:

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

    否则 GIT 会在前面添加你的 Windows GIT 路径。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        Brian's answer 的基础上,可以通过在克隆后运行以下命令来永久设置上传包路径,这样就无需在后续的拉取/获取请求中使用--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
        

        【讨论】:

        • 我尝试了您的建议,还在 .bashrc 中的路径中添加了“which git-receive-pack”,但不知何故 git push 仍然对我不起作用,尽管 repo 上传工作正常。知道为什么会发生这种情况吗?
        • @coredump,设置“remote.origin.receivepack”应该消除修改 .bashrc 中的 PATH 的需要。自己尝试git push --receive-pack /full/path/to/git-receive-pack,调整直到成功,然后修改.git/config(或运行“git config”)以永久设置接收包路径。
        • 感谢大家的回复!在我的情况下,获取服务器和推送服务器是不同的,并且获取服务器没有写权限。当我使用 git push 一切正常。
        • 这篇文章有助于更好地解释这一点,这对我有用,谢谢! twohard.com/blog/…
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          确保 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 中的路径。

          【讨论】:

          • 如果我在我的机器上运行该命令,路径是正确的,但如果我反过来运行它,则路径是错误的。 (从远程机器回到我的)编辑我的本地 .bashrc 修复它。谢谢
          • 在我的情况下,找不到该命令,因为 git 是通过 MacPorts 安装的,它把它放在 /opt/local/bin 中。通过PATH=$PATH:/new/path/here 将此添加到我的.bashrc 对我有用。
          • @ranReloaded 反斜杠应该转义美元符号并防止在本地机器上扩展 $PATH,而是将“echo $PATH”按字面意思传递给远程机器。这可能取决于您使用的外壳;它在 zsh 和 bash 中对我有用。您也许可以使用单引号获得正确的结果,例如“ssh you@remotemachine 'echo $PATH'” - 试一试。否则,您使用的是什么外壳?也许这里的其他人使用该外壳,可以为您提供解决方法。
          • @ranReloaded:当您说“未打印 git 路径”时,您的意思是 ssh 显示了很多东西,但没有显示 git 所在的路径吗?如果是这样,那么您遇到的问题与 OP 相同,并且使用符号链接只是一个创可贴。 "ssh .. echo \$PATH" 命令将向您显示远程计算机上的路径,这可能与您的登录路径不同,但这是使其正常工作的关键,您可以通过将 PATH 设置为包含 git 来做到这一点远程机器上的.bashrc。根据手册页,.profile/.bash_profile 仅用于交互式登录。
          • @ranReloaded:作为一个实验,在远程机器上,在你的主目录中,尝试摆脱所有其他 bash 点文件(.profile.bash_profile.login.bash_login 等)并且在.bashrc 中只有一行“export PATH=$PATH:/your/path/to/git”。然后,在本地机器上,尝试ssh you@remote echo \$PATH:它应该显示最后带有 /your/path/to/git 的路径。如果可行,您应该能够在 ssh 上毫无问题地使用 git,并且您可以从 dotfiles 中放回其他内容。如果失败,请发布它显示的内容。
          【解决方案7】:

          你必须添加

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

          .bashrc 中的这一行之前:

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

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              出于安全原因,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
              

              不会工作。

              【讨论】:

              • 这似乎是一个完美的提示,但它不适用于 10.6.6。 ssh user@host echo \$PATH 仍然显示硬编码的构建路径。添加了具有非扩展所需路径的 .ssh/environment。更改 /etc/sshd_config PermitUserEnvironment 是。没有骰子。有什么建议?谢谢。
              • 还尝试在客户端机器上设置 BASH_ENV='~/.nibashrc' 并在其中创建一个包含扩展路径的文件。也没有骰子。
              • 好的。所以把路径放在你要连接的机器上的 .bashrc 中对我有用。
              • 感谢关于变量扩展不适用于 .ssh/environment 的提示
              • 赞成解释 var 扩展确实有效。
              【解决方案10】:

              您也可以使用“-u”选项来指定路径。我发现这对我的 .bashrc 没有在非交互式会话中获取来源的机器很有帮助。例如,

              git clone -u /home/you/bin/git-upload-pack you@machine:code
              

              【讨论】:

              • 请注意:here 是关于如何使 .bashrc 在 ssh 会话中获取资源的说明。
              【解决方案11】:

              对于zsh,你需要把它放在这个文件中:~/.zshenv

              例如,在 OS X 上使用 MacPorts 的 git-core 包:

              $ echo 'export PATH=/opt/local/sbin:/opt/local/bin:$PATH' > ~/.zshenv

              【讨论】:

                【解决方案12】:

                我在使用 MsysGit 版本时遇到了这些错误。

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

                安装 Cygwin 版本的 Git

                在服务器上(带有 Cygwin SSHD 的 Win XP),这终于修复了它。

                我还是用MsysGit版本的客户端

                ..事实上,这是它唯一的工作方式 对我来说,因为我得到 POSIX 错误 Cygwin Git 从同一个 sshd服务器

                我怀疑在 Git 使用方面仍然需要做一些工作。 (在 Windows 中 ssh+易于拉/推)

                【讨论】:

                  【解决方案13】:

                  就像 Johan 多次指出需要它的 .bashrc 一样:

                  ln -s .bash_profile .bashrc

                  【讨论】:

                    【解决方案14】:

                    我找到并(成功地)使用了这个修复:

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

                    感谢Paul Johnston

                    【讨论】:

                      【解决方案15】:

                      Matt 的解决方案在 OS X 上不适合我,但 Paul 的解决方案可以。

                      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_session

                      【讨论】:

                      • 很高兴听到它对您不起作用。当您运行“ssh you@remote \$PATH”时,您介意告诉远程机器上的 PATH 是什么吗?
                      猜你喜欢
                      • 2012-06-23
                      • 2011-08-27
                      • 1970-01-01
                      • 2015-02-27
                      • 2013-09-19
                      • 1970-01-01
                      • 2012-07-30
                      • 1970-01-01
                      相关资源
                      最近更新 更多