6

我在不同的网络上有两个 git 存储库。我一直在他们两个之间毫无问题地交流,但由于某种原因,今天当我执行“git push”时,我收到以下错误:

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

我用谷歌搜索并确保“/usr/local/bin”在我的“$PATH”中。这是我的 git 的 bin 目录的输出:

[pradeep@laptop ]$ls -l /usr/local/git/bin/
total 16760
-rwxr-xr-x  1 root  wheel  4329416 Mar 26 20:06 git*
-rwxr-xr-x  1 root  wheel    14852 Mar 26 20:06 git-credential-osxkeychain*
-rwxr-xr-x  2 root  wheel   162402 Mar 26 20:06 git-cvsserver*
lrwxr-xr-x  1 root  wheel        3 Apr  3 11:02 git-receive-pack@ -> git
-rwxr-xr-x  2 root  wheel  1830248 Mar 26 20:06 git-shell*
lrwxr-xr-x  1 root  wheel        3 Apr  3 11:02 git-upload-archive@ -> git
-rwxr-xr-x  2 root  wheel  1893064 Mar 26 20:06 git-upload-pack*
-rwxr-xr-x  1 root  wheel   333121 Mar 26 20:06 gitk*

有什么想法可能会出错吗?

谢谢

-------------- 编辑 -------------------- 我的远程系统的“.bashrc”中有以下行:

export PATH=$LOCAL/git-1.8/bin/:$PATH

这是远程机器上的输出:

$ls $LOCAL/git-1.8/bin
git  git-cvsserver  gitk  git-receive-pack  git-shell  git-upload-archive  git-upload-pack

这是我从我的机器到远程机器执行“ssh user@remote env”时的输出:

[pradeep@laptop ~]$ssh k00603@k.rics.riken.jp env
SHELL=/bin/bash
SSH_CLIENT=153.133.52.171 52379 22
USER=k00603
MAIL=/var/mail/k00603
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/openssh/bin
PWD=/volume2/home/hp120242/k00603
SHLVL=1
HOME=/home/hp120242/k00603
LOGNAME=k00603
SSH_CONNECTION=153.133.52.171 52379 10.7.160.4 22
LC_CTYPE=en_US.UTF-8
_=/bin/env

bash 中缺少 git 路径。

编辑:以下是我的远程系统主目录中的“.bash_profile”:

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:$LOCAL/git-1.8/bin

export PATH
4

1 回答 1

7

当你 ssh 进入一个盒子并得到一个提示时,你实际上正在经历一个与运行命令时略有不同的过程。Shell 根据是否为登录 Shell 和/或是否为交互式会话,对获取哪些配置有规则。尝试运行:

ssh user@host env

这将打印您的环境,如非交互式登录会话所见。我的猜测是,/usr/local/git/bin在这种情况下,它不在路上。您可以使用以下--receive-pack选项解决此问题git push

git push --receive-pack=/path/to/git-receive-pack

/path/to/git-receive-pack是远程机器上的路径。它告诉 git 在 ssh 进入遥控器时在哪里可以找到另一端。

最好的答案是修复你的 shell 配置,但根据 shell 的不同,这可能会很棘手。我主要使用 ZSH,我通过设置 a 来解决这个问题~/.zshenv,它由 ZSH 在非交互式 shell 中获取。我认为 bash 的情况往往不太清楚。您可能需要编辑您的~/.bashrc和/或您的~/.bash_profile.

假设您在远程端安装了 vanilla Linux(可能是这种情况),并且它正在运行 bash shell,最简单的解决方法是更改​​您的.bashrc. 编辑~/.bashrc,并添加:

export PATH=/path/to/your/installed/git/bin:$PATH

/path/to/your/installed/git/bin您在主目录中安装 git 的位置在哪里。我倾向于将本地安装放在 中~/.local/bin,所以我的看起来像:

export PATH=$HOME/.local/bin:$PATH

你的可能只是:

export PATH=$HOME/bin:$PATH

你不说地点,所以我不能给你正确的表述。

在大多数系统上,.bashrc即使向 ssh 提供了命令,也是 source。进行此更改后,ssh user@host env再次尝试运行。您应该在路径变量中看到包含 git 二进制文件的 bin 文件夹的位置。然后你应该能够做类似的事情ssh user@host git --version并看到类似的东西:

git version 1.8.2

如果您看到一个错误,那么您可能没有正确输入路径,或者当您 ssh 进入机器时 .bashrc 没有被拾取。

示例 .profile

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

自动使用--receive-pack

假设您的遥控器名为origin,您可以这样做:

git config --local remote.origin.receivepack \
    /path/to/git-receive-pack/on/the/remote

您可能还需要修复上传包:

git config --local remote.origin.uploadpack \
    /path/to/git-upload-pack/on/the/remote
于 2013-04-03T08:42:08.173 回答