Git push 导致致命:协议错误:错误的行长度字符:这

Posted

技术标签:

【中文标题】Git push 导致致命:协议错误:错误的行长度字符:这【英文标题】:Git push results in fatal: protocol error: bad line length character: This 【发布时间】:2014-04-14 09:22:08 【问题描述】:

我正在尝试让 GitLab 在我的服务器上运行(运行 CentOS 6.5)。我跟着gitlab-receipe 排队,但我就是无法让它工作。我可以访问 Web 界面,创建新项目,但推送到主分支返回以下错误:

fatal: protocol error: bad line length character: This

我已经对生产环境做了检查,结果如下:

Checking Environment ...

Git configured for git user? ... yes

Checking Environment ... Finished

Checking GitLab Shell ...

GitLab Shell version >= 1.7.9 ? ... OK (1.8.0)
Repo base directory exists? ... yes
Repo base directory is a symlink? ... no
Repo base owned by git:git? ... yes
Repo base access is drwxrws---? ... yes
update hook up-to-date? ... yes
update hooks in repos are links: ... 
ASC / Wiki ... repository is empty
Running /home/git/gitlab-shell/bin/check
Check GitLab API access: OK
Check directories and files: 
    /home/git/repositories: OK
    /home/git/.ssh/authorized_keys: OK
Test redis-cli executable: redis-cli 2.4.10
Send ping to redis server: PONG
gitlab-shell self-check successful

Checking GitLab Shell ... Finished

Checking Sidekiq ...

Running? ... yes
Number of Sidekiq processes ... 1

Checking Sidekiq ... Finished

Checking LDAP ...

LDAP is disabled in config/gitlab.yml

Checking LDAP ... Finished

Checking GitLab ...

Database config exists? ... yes
Database is SQLite ... no
All migrations up? ... yes
GitLab config exists? ... yes
GitLab config outdated? ... no
Log directory writable? ... yes
Tmp directory writable? ... yes
Init script exists? ... yes
Init script up-to-date? ... no
  Try fixing it:
  Redownload the init script
  For more information see:
  doc/install/installation.md in section "Install Init Script"
  Please fix the error above and rerun the checks.
projects have namespace: ... 
ASC / Wiki ... yes
Projects have satellites? ... 
ASC / Wiki ... can't create, repository is empty
Redis version >= 2.0.0? ... yes
Your git bin path is "/usr/bin/git"
Git version >= 1.7.10 ? ... yes (1.8.3)

Checking GitLab ... Finished

对于初始化脚本错误,收据上写着

如果您确定已下载,请不要介意该错误 最新的

因为我已经下载了最新的,所以我真的无能为力。

过去一周我一直在敲我的脑袋,不知道为什么会发生这个错误,任何帮助将不胜感激!

【问题讨论】:

检查数据库服务器(mysql 或 Gitlab 使用的任何东西)是否正在运行。 【参考方案1】:

另一个...

我的配置有点复杂。在服务器端,我使用了一个名为Gogs 的自托管Git 平台(主要是因为它是用Go 编写的,我❤️Go!)。 Gogs 有一个用于更新的内置 SSH 服务器,但它仍然需要来自主 SSH 服务器(充当某种代理或前端)的一些“帮助”,通常在与 Gogs 相同的用户下运行(通常@ 987654323@,但这取决于系统管理员)。

现在,最近,我一直在尝试限制通过 shell 帐户的访问,在大多数情况下为他们提供 SFTP 访问权限;我也将剩下的几个 FTP 帐户(哎呀!)转移到了 SFTP。在这样做的同时,我终于设法找到了 SSHD 配置的错误,这阻止了我的设置更加自动化(基本上,将用户添加到 SFTP 组或 SSH 组以授予他们访问权限;我不得不重新加载 SSHD每次我添加另一个用户时,这很痛苦......尤其是如果出现一些错误并且我将失去对远程服务器的 SSH 访问权限!!)。在所有这些更改之后,我确实测试了相当多的帐户,看到它们都在工作,但没有注意到一个微小的错误:用户 gitboth 组中(SFTP SSH)。由于 SSHD 的配置方式,它会首先查找 SFTP 组,然后查找 SSH。因为这个用户在 both 上,所以 SSHD 将给它 only 的 SFTP 访问权限(这与分配给用户的任何 shell 无关)。所以,发生的事情是以下错误消息被回显:

PTY allocation request failed on channel 0
This service allows sftp connections only.
Connection to my.server.name closed.

请注意,第一行(以及最后一行)很可能是来自控制台会话管理器的“本地”消息。 git 收到的错误当然是此服务只允许 sftp 连接。,因此它得到了前四个字母 - This - 提示错误。

确保 git 用户仅在 shell-access 组中修复了问题:

PTY allocation request failed on channel 0
Hi there, You've successfully authenticated, but Gogs does not provide shell access.
If this is unexpected, please log in with password and setup Gogs under another user.

这是使用 Gogs 时的预期行为:虽然从 系统 的角度来看,它“允许”shell 帐户(这是使其工作的唯一方法),但这些连接正在被捕获由 Gogs 提供,它知道它不应该允许任何 shell 帐户 - SSH 协议仅用于允许 Git 推送/拉取并使用其自己的身份验证(在 Gogs 内部管理 - 不在操作系统级别)。

我知道,这很可能是一个边缘案例,会影响 0.000000000000001% 通过 Google 重定向到此答案的所有人?

我的意思很简单:臭名昭著的fatal: protocol error: bad line length character: This 可以来自This service allows sftp connections only. 行,这意味着您拥有的用户无权访问完整的shell 帐户。这应该至少可以提示您开始搜索什么——Git 用户的配置错误,无论是在 SSHD 级别还是在用户 ID/组级别。

【讨论】:

【参考方案2】:

我在 Windows 上的解决方案是在 .git/config 中将连接切换到 SSH:

[远程“原点”] url = git@github.com:

如此处所述:

https://help.github.com/en/articles/changing-a-remotes-url

【讨论】:

【参考方案3】:

就我而言,我仅在 Windows 的“SSH 扩展”中观察到此错误。

同样的命令从命令行工作。我将 SSH 设置从 PuTTY 切换到 OpenSSH,它停止产生错误。

【讨论】:

【参考方案4】:

在我的情况下,通过使用 chsh 将远程 git-user shell 更改为 git-shell 来修复错误:

chsh -s $(command -v git-shell) git

官方git-shelldocumentation。出于安全原因,强烈建议在远程存储库服务器上将此 shell 用于 git-user。

【讨论】:

【参考方案5】:

您可以通过以下方式获取实际的错误消息:

ssh git@yourgitlabserver.com "git-upload-pack yournamespace/yourreponame.git"

根据this git documentation git 协议期望在每行的开头是它的大小,然后是内容。看起来 GitLab 没有这样做,而是直接发送错误消息。

【讨论】:

该命令不会返回任何看起来像错误消息的内容【参考方案6】:

我的错误是:fatal: protocol error: bad line length character: No s

这是因为我忘记在我的 Maven 项目的 pom.xml 中指定 SCM 标记,所以它使用了来自父项目的 SCM 信息。 我还必须将我们的 Jenkins 用户添加到 GitLab 的项目中。

【讨论】:

【参考方案7】:

当我想推送我的提交时,我收到了这个错误:

fatal: protocol error: bad line length character: No s

我只是通过 ssh 连接检查解决了这个问题:

ssh Git@hostIp

【讨论】:

【参考方案8】:

有同样的问题,在我的情况下,原始仓库已被移动,更改 .git/config 解决了我的问题。

【讨论】:

【参考方案9】:

我的解决方案是取消设置指向 putty (plink.exe) 的 GIT_SSH 环境变量

【讨论】:

【参考方案10】:

只是在我的情况下向其他人添加一个可能的解决方案。 就我而言,我试图推送标签。

git push heroku MYTAG:master

直到我取消引用它的标签才起作用

git push heroku MYTAG^:master

您可以在此处阅读有关它的更多信息: What does ^ mean in git?

<rev>^, e.g. v0.99.8^

后缀 ^ 后跟一个空大括号对意味着对象可以是一个标签,并递归地取消引用该标签,直到找到一个非标签对象。

【讨论】:

【参考方案11】:

更改 git 的外壳

usermod -s /usr/bin/git-shell git

【讨论】:

【参考方案12】:

我遇到了同样的问题,结果发现我在一个 git 分支上工作。我需要做的就是推给主人。

$ git push <remote> <local branch name>:<remote branch to push into>

【讨论】:

【参考方案13】:
sudo gitlab-ctl reconfigure

然后

sudo gitlab-ctl restart

应该做的伎俩

【讨论】:

这正是我的 gitlab 机器上的问题!【参考方案14】:

将我的经验添加到这个已经很长的可能解决方案列表中。

在我的情况下,我可以访问我克隆的存储库,但无法访问 package.json 所指的其他一些内部存储库,即依赖项或 devDependencies。 因此,解决方案也可以访问这些存储库。

【讨论】:

【参考方案15】:

就我而言,我的用户名已更改,并且此存储库的 git 配置未更新以匹配新名称。

检查您的 git 遥控器以确保它们指向正确的位置:

git remote -v

通过手动编辑配置来更新配置:

vim .git/config

或通过命令

git remote set-url origin https://github.com/USERNAME/OTHERREPOSITORY.git

【讨论】:

【参考方案16】:

仅供其他用户参考:

fatal: protocol error: bad line length character: no s
can be a truncated answer for "No such project".

在我的例子中,这种错误可以通过在 gitlab 中添加用户(甚至你自己)到项目中来修复:

https://gitlab.com/username/your_project/project_members

另外,确保您的公钥设置在您的用户Profile settings &gt; SSH Key or in Project &gt; Settings &gt; Deploy Keys

https://gitlab.com/profile/keys

【讨论】:

我觉得自己很笨。另一个开发人员带着这个问题来找我,长话短说,我忘了将他添加到 GitLab 项目的组中。谢谢! 这是另一个正确答案,因为我用--shell /bin/bash 创建了git 用户。可能大多数刚接触 Gitlab 的人都会忘记将用户添加为项目成员。 天哪,这并不明显。感谢您将此添加为答案。【参考方案17】:

我今天遇到了这个错误消息(“No s”),这实际上与我无权推送到目标存储库有关。尽管错误消息很奇怪,但这可能有助于人们继续工作。

我们使用 Gitlab。

【讨论】:

【参考方案18】:

在我的情况下(通过 ~/.ssh/config 的私钥)我不得不省略 ssh 部分:

git clone ssh://git@hostname:username/repository.git

它适用于:

git clone git@hostname:username/repository.git

错误信息是:

致命:协议错误:错误的行长度字符:无 s

【讨论】:

这对我有用 - 并为选美添加了 ssh 密钥。【参考方案19】:

另一种可能是您拼错了存储库名称。

在过去的两天里我做了两次。我添加了一个遥控器并拼错了它,我在 GitLab 上创建项目时拼错了名称。

在这两种情况下,当我尝试推送到远程时,我得到了

fatal: protocol error: bad line length character: No s

所以检查拼写!

此外,如果您以不同的名称(如组)创建项目,请确保这是您添加的遥控器。

【讨论】:

我也有同样的情况,因为我不知道它是否区分大小写。 我收到此错误是因为我在主机上设置了密钥,但忘记在 gitlab 中启用密钥。在 gitlab 中启用密钥修复它。 仅供其他用户参考:致命:协议错误:错误的行长度字符:没有 s 可以是“没有这样的项目”的截断答案。在我的情况下,可以通过在 gitlab 中将用户(甚至您自己)添加到项目中来修复这种错误:gitlab.com/username/your_project/project_members 另外,请确保在您的用户“配置文件设置”> SSH 密钥或项目> 中设置了您的公钥设置 > 部署密钥【参考方案20】:

我的问题的解决方案是我忘记为项目添加部署密钥(对于我尝试部署的用户)。

在https://gitlab/group/project/deploy_keys 中添加一个部署密钥让我失望了。

【讨论】:

是的,我还没有加载我的私钥(使用选美)【参考方案21】:

要检查的另一件事是您的 .bashrc 不会打印额外的内容。 例如 .bashrc 中的 'echo "hello"' 会产生错误:

kruus@borg:~/malt$ ssh snake01
Last login: Tue Oct 21 10:44:31 2014 from 138.15.166.103
hello
...
kruus@snake01:/net/snake01/usr/hydra/kruus/malt$ git pull
fatal: protocol error: bad line length character: hell

请注意打招呼是如何导致严重问题的。

从我的 .bashrc 中删除 'echo "hello"' 允许 git 再次按预期工作。如果你的 .bashrc 做了更复杂的事情,你可能需要 ">& /dev/null" 来删除输出。

【讨论】:

这是我经历过的确切用例... Echo "Hello"。很好!谢谢埃里克,也感谢谷歌找到你的答案。我再也不会说回声“你好”! 哈哈,这里也一样!解决方法是什么? I/O 重定向放在哪里? 在我的情况下,当通过 putty 输入用户名和密码时,我收到消息“此帐户中未启用 Shell 访问”,通过控制台启用访问,一切都很棒【参考方案22】:

如果其他人有这个问题,解决方案是将用户 'git'(或任何你的用户)的登录 shell 更改为 /bin/bash。这可以通过以下命令完成:usermod -s /bin/bash git (Link)。更改登录 shell 的原因是因为 git 用户的默认 shell 是 /sbin/nologin(或类似,取决于环境),这会阻止 git 应用程序以 git 用户身份登录 git 服务器。

【讨论】:

任何适用于 Windows 的解决方案?使用 SmartGit 时出现此错误 @Nav:这与您的客户无关。这是在服务器端进行的更改,据我所知,GitLab 不适用于 Windows。 对于 smartgit 我认为您需要在执行 add remote 时将 git@bitbucket.org:username/repo-slug 更改为 https://&lt;username&gt;:&lt;password&gt;@bitbucket.org/username/repo-slug.git 拒绝投票,因为这是一个严重的安全问题,因为您将向任何拥有注册 SSH 密钥的人授予对服务器的 shell 访问权限。 顺便说一句,你应该使用usermod -s `which git-shell` git

以上是关于Git push 导致致命:协议错误:错误的行长度字符:这的主要内容,如果未能解决你的问题,请参考以下文章

Git 因致命错误而失败。拒绝将不相关的历史与 git push 合并?

致命:协议错误:行长字符错误:Pa

Git 和讨厌的“错误:无法锁定现有信息/引用致命”

克隆 git repo 导致错误 - 主机密钥验证失败。致命:远端意外挂断

git push origin master> 致命:HTTP 请求失败

“git add <file_name>”命令导致错误“致命:pathspec'file_name'没有匹配任何文件