在克隆远程 Git repo 时,没有找到 Git-load-pack: command not found

我一直在使用 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 上传-包的 RTFM 解决方案) ,但这是真的很烦人,加上’git 推’不工作,因为我不认为有一个 --unpack=选项。

顺便说一下,所有 git 命令都可以在我的本地机器上正常工作,它是软件的相同版本(1.5.4.2) ,安装在 /usr/local/bin的相同 NFS 挂载上。

有人能帮忙吗?

136879 次浏览

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

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

执行:

chmod +x /usr/local/bin/ssh_session

/etc/sshd_config中加入以下内容:

ForceCommand/usr/local/bin/ssh _ session

我找到并成功地使用了这个补丁:

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

多亏了 Paul Johnston

对于 bash,它需要放到. bashrc 而不是. bash _ profile 中(. bash _ profile 也只适用于登录 shell)。

正如约翰多次指出的那样:

Ln-s. bash _ profile. bashrc

我在 MsysGit 版本中出现了这些错误。

在听取了这里和其他地方能找到的所有建议后,我最终决定:

安装 Cygwin 版本的 Git

在服务器上(使用 Cygwin SSHD 的 Win XP) ,这最终修复了它。

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

事实上,这是唯一的办法 对我来说,因为我得到了 POSIX 错误 Cygwin Git 从那里拉出来的 Sshd 服务器

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

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

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

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

您还可以使用“-u”选项来指定路径。我发现这对机器很有帮助。Bashrc 不能在非交互式会话中获得源代码。比如说,

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

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

#PermitUserEnvironment no

PermitUserEnvironment yes

然后根据需要创建 ~/. ssh/Environment 文件:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

注意,读取 ~/. ssh/环境文件时不会发生变量扩展,因此:

PATH=$PATH:/usr/local/git/bin

没用的。

布莱恩的回答基础上,可以通过在克隆后运行以下命令来永久设置上载包路径,这样就不需要在后续的 pull/撷取请求中使用 --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的常用用户可能对以下别名感兴趣。我的克隆应该是不言而喻的。可以通过用 git mypush替换 git push等方式,将 myfett/mypull/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

我一直有问题连接到一个 Gitoliterepo 使用来自 Windows 的 SSH,结果是我的问题是 PLINK!它一直要求我输入密码,但 ssh gitolite@[ host ]可以很好地返回回购列表。

检查你的环境变量:。如果它被设置为 Plink,那么尝试不使用任何值(“ set GIT _ SSH =”) ,看看是否有效。

必须添加

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

在. bashrc 的这一行之前:

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

否则将不执行所有导出语句(看这里)。

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

我的情况是在 Win10与 GIT bash,我没有一个标准位置下的 GIT。相反,我把 git 放在/app/local/bin 下面。 我使用了@Garrett 提供的命令,但需要更改路径,以 double/开始:

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

否则 GIT 将在前面添加您的 WindowsGIT 路径。

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

sudo apt-get install git

或同等的其他包管理系统。

如果您使用 GitHub 企业版,请确保回购是 public,而不是 internal。对于内部回购来说,可能还有其他的方法来解决这个问题,但是这是最快的方法来解决这个问题,而不需要花费更多的时间和人力。