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

Posted

技术标签:

【中文标题】git-upload-pack:克隆远程 Git 存储库时找不到命令【英文标题】:git-upload-pack: command not found, when cloning remote Git repo 【发布时间】: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

有人可以帮忙吗?

【问题讨论】:

另请参阅 ***.com/questions/1509246/… ,以了解您想要使用远程计算机上未安装 git 的远程存储库的情况 【参考方案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 是什么吗?

以上是关于git-upload-pack:克隆远程 Git 存储库时找不到命令的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse:尝试克隆 CodeCommit 存储库并收到以下错误:“...git-upload-pack not allowed on...”

解决eclipse中egit中的cannot open git-upload-pack问题

git 报错git-upload-pack 解决方法

如何解决:“无法打开 'git-upload-pack'” Eclipse 中的错误?

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段