1

场景

  • 我可以访问这个不再接收任何类型更新的旧 linux 服务器。只有打破和修复。服务器上没有安装 git,所以我在本地用户的 ~/opt/bin 上安装了它。我将目录添加到我的路径中,并且为了在服务器上进行开发,我几乎可以用 git 做所有我需要做的事情。
  • 我决定在我的工作站上进行开发并推送到准备好的生产代码会很酷。
  • 我在我的服务器上设置了一个裸存储库,创建了一个带有 checkout -f 到我的 GIT_WORK_TREE 的 post-receive 文件,似乎一切都相应地设置了。

问题

当我尝试推送我的主分支时,我收到以下错误:

 sh: git-receive-pack: command not found
 fatal: The remote end hung up unexpectedly

我知道为什么会这样。我的 SSH 上的 $PATH 只看到/usr/bin:/bin:/usr/sbin:/sbin

我的用户是使用 /bin/sh shell 设置的,因此不能使用 .profile/.bashrc/.bashprofile 。

我也不能使用 .ssh/environment,因为我PermitUserEnvironment的设置为 no。

我试图创建一个钩子/预接收并在那里设置路径,但这也不起作用。

关于如何让 SSH 看到 git 并让它工作的任何想法?

谢谢

4

2 回答 2

1

我找到了!

http://www.wiredrevolution.com/git/fix-git-upload-pack-and-git-receive-pack-errors-on-shared-hosting

第二种解决方案涉及在 [remote "origin"] 下的本地 .git/config 文件中添加 git-upload-path 和 git-recieve-path 的路径。这是最简单的方法,因为您只需进行一次更改。

[remote "origin"]
url = <repo address>
fetch = +refs/heads/*:refs/remotes/origin/*
uploadpack = <path to git-upload-pack>
receivepack = <path to git-receive-pack>
于 2012-02-09T09:38:21.933 回答
0

这是使用默认 ssh 守护进程的问题:它强制PATH为不可变值,如果您的工具(此处为“git”)未安装在根管理路径(如/usr/bin)中,则无法添加它(您可以提出的任何请求,例如/usr/bin指向您的 git 可执行文件的符号链接,都将被视为安全风险)。

我遇到的唯一解决方案是编译自己的 ssh(使用自己的帐户运行)以适应工具的本地安装。
这就是我在GitHub 项目 compileEverything中实现的(除了其他工具之外,它还编译了一个 ssh 守护进程)。

于 2012-02-09T08:35:03.160 回答