175

我一直在使用 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)命令有效,(并根据 RTFM 解决方案证明它$PATH包含“git-upload-pack”的路径)但这真的很烦人,加上“git push”不起作用,因为我认为没有--unpack=选择。

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

有人可以帮忙吗?

4

15 回答 15

173

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

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

ssh you@remotemachine echo \$PATH

(这适用于 Bash、Zsh 和 tcsh,可能也适用于其他 shell。)

git-upload-pack如果它.bashrc返回.zshenv的路径不包括具有.cshrc.

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

如果您不确定需要将哪个路径添加到您的 remote PATH,您可以使用以下命令找到它(您需要在远程机器上运行它):

which git-upload-pack

在我打印的机器上/usr/bin/git-upload-pack。因此,在这种情况下,/usr/bin您需要确保的路径位于远程非登录 shellPATH中。

于 2008-10-22T11:20:42.363 回答
67

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

git clone -u /home/you/bin/git-upload-pack you@machine:code
于 2009-10-29T23:50:58.860 回答
62

基于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

这两个命令相当于将以下行添加到 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 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
于 2011-06-27T16:15:22.170 回答
30

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

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

感谢保罗约翰斯顿

于 2009-02-15T01:49:39.597 回答
12

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

不管用。

于 2010-02-16T21:33:24.617 回答
7

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

于 2009-01-05T12:06:23.487 回答
7

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

于 2009-02-21T17:20:53.557 回答
5

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

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

安装 Cygwin 版本的 Git

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

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

..事实上,它对我有用的唯一方法,因为我从同一个 sshd 服务器中提取 Cygwin Git 时遇到 POSIX 错误

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

于 2009-03-26T06:56:33.327 回答
1

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

ln -s .bash_profile .bashrc

于 2009-03-16T20:42:14.063 回答
1

您必须添加

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

在 .bashrc 中的这一行之前:

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

否则所有的导出语句都不会被执行(见这里)。

于 2011-09-26T17:05:55.000 回答
1

我的案例是在带有 GIT bash 的 Win 10 上,而我在标准位置下没有 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 路径。

于 2019-08-30T17:48:55.360 回答
0

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

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

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

于 2009-08-12T23:41:09.370 回答
0

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

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

于 2011-08-31T05:03:26.980 回答
0

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

于 2013-03-30T14:17:35.470 回答
0

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

sudo apt-get install git

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

于 2020-06-11T22:42:14.927 回答