【问题标题】:git push error git-receive-packgit push 错误 git-receive-pack
【发布时间】:2013-03-24 13:19:33
【问题描述】:

我在不同的网络上有两个 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

【问题讨论】:

  • 这个/usr/local/git/bin/ 在你的$PATH 中吗?
  • 是的。 [pradeep@laptop]$echo $PATH /Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/Current/bin:/Users/pradeep/softwares/hdf-java/ bin/:/Users/pradeep/softwares/ParaView/paraview-bin/bin/:/Users/pradeep/softwares/ParaView/paraview-bin/bin/paraview.app/Contents/MacOS/:/Users/pradeep/code/ python_utilities/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/git/bin:/usr/texbin:/Users/ pradeep/bin
  • 您应该在遥控器上检查PATH,而不是从您尝试push 的机器上检查。我这么说是因为pradeep@laptop 看起来不像远程服务器。如果确实如此,请忽略此评论。
  • 在远程机器上我没有root权限,所以我在本地帐户中安装了git。并且本地安装的 git 的 bin 目录在我的 PATH 声明中。
  • @jhaprade - 您的远程 url 使用本地帐户的用户名还是有单独的帐户?

标签: git


【解决方案1】:

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

ssh user@host env

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

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

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

最好的答案是修复你的 shell 配置,但根据 shell 的不同,这可能会很棘手。我主要使用 ZSH,我通过设置一个 ~/.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

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

在大多数系统上,即使向 ssh 提供了命令,.bashrc 也是来源。进行此更改后,请尝试再次运行 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

【讨论】:

  • 我已经尝试过您建议的 git push 的 --receive-pack 选项,但它不起作用。当我执行您推荐的第一个 ssh 命令时,我将获取我的 git 可执行文件存储在 PATH 列表中的 bin 文件夹。我很惊讶,因为几周前 git 在我的笔记本电脑和远程系统之间运行得非常好。我不明白为什么它会突然停止工作。
  • 嗯...如果--receive-pack 不起作用,那么要么您输入错误的路径,它是一个损坏的链接,或者它只是完全损坏。在远端运行git-receive-pack 是否有效?它应该只打印出一条帮助消息。 ssh user@host 'type -f git-receive-pack' 的输出是什么?我不确定为什么它也会停止工作。它闻起来像是环境中的某些东西发生了变化。 user@host 是否有权运行 git-receive-pack 可执行文件?
  • 嗨,很抱歉回复晚了。我再次查看,我确实在“ssh user@host env”的输出中没有 git 文件夹的 bin 目录。但是我该如何解决呢?当你说使用“git push --receive-pack=/path/to/git-receive-pack”时,应该是我本地机器或远程机器上的“git-receive-pack”路径?如果可能的话,你能给我举个例子吗?
  • 最简单的修复方法是编辑您的 .bashrc 以包含包含 git 的文件夹。我更新了我的回复,显示了更多关于如何做到这一点的信息。如果您可以修复PATH,那么您将无需担心--receive-pack。不过,作为记录,--receive-pack 的参数应该是 remote 上的路径。所以,git push --receive-pack=/home/username/bin/git-receive-pack,或类似的。但最好的选择就是在远端修复路径。
  • 我已经编辑了我的原始帖子,让您了解我目前的设置。我想我已经按照你的建议做了,但是 ssh 仍然没有看到远程机器上的 git 路径。
猜你喜欢
  • 2015-08-28
  • 2012-05-15
  • 2012-07-30
  • 2019-04-27
  • 2020-09-15
  • 2013-03-13
  • 1970-01-01
  • 2010-10-17
  • 2016-09-27
相关资源
最近更新 更多