Git远程:错误:致命:协议错误:行长错误字符:Unab


119

我设置了一个git服务器,现在想从客户端开始推送我的仓库。我用过git push origin master并得到以下错误信息:

fatal: protocol error: bad line length character: Unab

我不知道怎么了 我不知道“ Unab”是什么。我试图调整外壳大小,但它仍然是“ Unab”。我找不到此错误消息的解决方案。

我使用“ authorized_keys”和SSH设置服务器。(我可以使用SSH连接到它。)

好像是个git问题?

顺便说一句:服务器是在Windows 7 VM中设置的


遇到类似的问题:“致命:协议错误:行长字符错误:此”,我的错误消息是“此帐户当前不可用”。
hj'17

Answers:


117

该错误消息有点令人讨厌,但实际上试图告诉您的是远程服务器未使用正确的git响应进行回复。最终,运行该git-receive-pack进程的服务器上出现了问题。

在Git协议中,前四个字节应为行长。相反,它们是字符Unab……这可能是某种错误消息的开始。(即可能是Unable to...在做某事)。

跑步时会发生什么ssh <host> git-receive-pack <path-to-git-repository>?您应该会看到错误消息,表明您的git客户端正在倒转,您也许可以对其进行更正。


10
那,并且ssh <host> /bin/true不应该输出任何东西。
StefanNäwe2011年

9
我遇到了同样的问题,原因是我的.bashrc中有一个'echo“ .bashrc”',所以不是“致命:协议错误:行长错误字符:Unab”,我看到的是“致命:协议错误:行长错误”字符:.bas”。
snarkyname77

4
正确,那也是我的问题:.bashrc在我尝试从中托管Git信息库的计算机上,有一行会向标准输出产生回波。(也就是说,我是远程计算机上存储库的所有者,所以是.bashrc引起此问题的我。)我在另一个答案中使用了用户ruslo给出的技巧,即将该命令的输出从stdout重定向到stderr(some_command 1>&2)。之后,git pull再次工作。
Teemu Leisti 2014年

2
使用上面的命令,输出只是挂起。它列出了我的所有分支,每行一个,然后在最后打印的行上,我0000 立即获得输出和光标,就好像要写出另一行但从未完成一样。
demongolem '16

2
我讨厌碰到一个七岁的问题,但是我用git-receive-pack遇到了同样的0000问题。它挂在那里,直到我按回车四次为止,此时它报告相同的协议错误并退出。
马克·E·汉密尔顿

60

我有类似的问题,但确切的错误消息是:

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

这是在Windows中,GIT_SSH设置为plink.exePuTTY 的路径。

可能的问题和解决方案:

  • 确保路径plink.exe正确。例如,Unix样式路径也可以正常工作/c/work/tools/PuTTY/plink.exe
  • 确保PuTTY(pageant.exe)的关键代理正在运行
  • 确保密钥代理包含用于访问服务器的有效密钥

7
我在Windows上遇到了相同的问题,但由于相反的原因却是相同的根本原因。我试图使用Cygwin(和嵌入式Git SSH),但GIT_SSH设置为C:\ ... \ plink.exe,这会导致冲突。一旦删除此文件,一切正常。
马特·霍尔茨曼

11
从环境变量中删除GIT_SSH条目对我来说很成功
chamalabey

升级GitExt后出现类似错误,必须重新启动选美并重新导入.ppk密钥文件。
比尔·多兰

9
我只是忘了将私钥加载到pageant中以什么结尾fatal: protocol error: bad line length character: git@。多么令人误解的错误消息。
路德维希

1
就我而言(Windows 10)选美没有运行。一旦启动并向其中添加了私钥,就可以使用。
4

28

对于GitExtension用户:

将git升级到2.19.0后,我遇到了同样的问题

解:

工具>设置> Git扩展> SSH

选择[ OpenSSH ]而不是[ PuTTY ]

在此处输入图片说明


当您收到错误消息时,这正是我所做的fatal: protocol error: bad line length character: git@。确保已生成SSH密钥并将其添加到GitLab。也许需要重启Git Extensions
测试

20

在Windows上安装GIT之后,我遇到了同样的问题。起初它起作用了;然后,一天后(在PC重新启动后)不再存在了,我得到了:

$ git pull
fatal: protocol error: bad line length character: git@

问题在于,重新启动后,自动启动的Putty“ pageant.exe”不再具有活动的私钥了。当您在选美中添加密钥时,默认情况下它不是永久设置。我只需要再次添加密钥,它就可以正常工作。因此,对于这种情况,有必要使pagenant自动加载密钥,如下所述:

https://www.digitalocean.com/community/tutorials/how-to-use-pageant-to-streamline-ssh-key-authentication-with-putty


对我来说,情况是,在Visual Studio中,每次Windows重新启动时,我都会收到错误消息:“ Git失败并出现致命错误。协议错误:行长字符错误:gitu”。选美过程根本没有开始。我需要使用例如TortoiseGit在后台解决此问题,然后GIT在Visual Studio中像魔咒一样工作。
Honza P.

18

也许您在服务器的.bashrc中有一条语句会产生输出。我举个例子:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
rvm use ruby-1.9.3-p194@rails32

在这种情况下,来自rvm使用的输出将(错误地)解释为来自git。因此,将其替换为:

rvm use ruby-1.9.3-p194@rails32 > /dev/null

在我的Windows 10中,问题是我的cmd启动init.cmd脚本(由这些指令创建的:stackoverflow.com/questions/17404165/…)输出了一些与docker相关的命令。但这是相同的原则。谢谢!
ET-CS

对我来说就是这种情况。我的.bashrc文件中有一个“ banner”命令。评论出来解决了这个问题。谢谢 :)。
杰米


10

您可以将任何输出从重定向.bashrcstderr

# inside .bashrc
echo 'some error/warning/remind message' 1>&2

git将忽略此符号


对我来说就做到了。我的发言rvm use 2.0.0-p353.bashrc一定很困惑git pull。追加并重1>&2试后,git pull工作正常。
Teemu Leisti 2014年

7

我在使用Git Bash的Windows上遇到了类似的问题。尝试执行git clone时,我一直收到此错误。该存储库位于安装了GitLab的Linux机器上。

git clone git@servername:path/to/repo
fatal: protocol error: bad line length character: git@

我确保生成了ssh密钥。公钥已添加到GitLab。ssh-agent正在运行,并且添加了生成的密钥(github链接)。

我用尽了所有选项,然后最终尝试关闭Git Bash,然后右键单击“以管理员身份运行”再次将其打开。在那之后工作。


我看到的是同一件事(Windows 10 64位),但是以管理员身份运行不能解决问题。
Ed Avis

4
我对造成这种情况的原因有预感。如果您没有设置ssh密钥对(或者由于某种原因无法读取),那么ssh会提示您输入密码。在Windows上,标准输出和控制台输出之间没有明显的区别,因此密码提示进入标准输出:“ git @ whatever's password:”。git将此视为损坏的协议输出。
Ed Avis

@EdAvis谢谢!我遇到了同样的问题,在阅读您的评论后,我再次检查了关键代理(通常在计算机启动时运行)。原来,它由于某种原因没有运行...
Griddo

5

这可能会帮助某人。当我尝试从EC2实例克隆项目时,出现以下错误:

Cloning into 'repo1'...
fatal: protocol error: bad line length character: logi

对我来说,解决方法包括以下步骤:

  1. 确保在EC2实例中添加/更新了SSH密钥(公共)。
  2. 确保身份验证代理(在我的情况下为Pageant = Putty身份验证代理)正在运行,并且已加载相应的私钥。
  3. 将EC2 SSH密钥ID用作git clone的公共密钥。例:

    git clone ssh:// {SSH密钥ID}@someaccount.amazonaws.com/v1/repos/repo1


4
注意:这是因为您正在使用plink,如果这样做了,plink <server_name> ls则plink打印到stdout的第一件事是login as,而git似乎正试图将其解释为重要内容。一个快速的解决方法是简单地unset GIT_SSHunset SVN_SSH。更多信息在这里
Pod

@Pod你是正确的,在Windows这些命令应该有所帮助:set GIT_SSH=set SVN_SSH=
马克西姆Kostromin

我在TFS上也遇到了同样的问题。添加密钥ID后,一切正常,谢谢!
安德烈·霍夫迈斯特


3

检查用于连接到远程计算机的帐户上的启动文件是否包含“ echo”语句。对于Bash shell,这些将是您的.bashrc和.bash_profile等。Edward Thomson的回答是正确的,但是我遇到的一个具体问题是,通过ssh登录到服务器时出现一些样板输出。Git将获取该样板的前四个字节,并引发此错误。现在,在这种特定情况下,我将猜测“ Unab”实际上是作品“ Unable ...”,这可能表明Git主机上还有其他问题。


3

以我为例,提取后的内容为:fatal: protocol error: bad line length character: Pass。同样在推后,我得到了:fatal: protocol error: bad line length character: git@ Done

Windows重新启动后,我不得不再次启动“ PuTTY代理”(pageant.exe),并添加一个从密钥列表中消失的私钥。


2

仅供参考,我将CentOS6容器升级到CentOS7后也得到了同样的错误消息-构建容器时某些git操作开始失败,例如

# git remote show origin
fatal: protocol error: bad line length character: Inva

运行ssh给我一个错误,我可以搜索:

# ssh git@bitbucket.org
Invalid clock_id for clock_gettime: 7

那导致我进入https://github.com/wolfcw/libfaketime/issues/63,在那里我意识到我忘记了LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1在父Dockerfile中有一个。评论出该错误已解决。



2

我遇到了同样的错误,"fatal: protocol error: bad line length character: shmi" 在本shmi例中,where 是用户名。我在中将SSH从PuTTY切换到OpenSSH "Git Extensions->Settings->SSH"。它有帮助。



1

以下内容可能对某人有帮助:尝试克隆我的AWS EC2实例上的项目时,出现以下错误:

Cloning into 'AWSbareRepo'...
fatal: protocol error: bad line length character: Plea

这是由于尝试以root身份而不是EC2-USER身份使用ssh引起的。如果您实际上不进行git克隆而使用ssh ...,您将在“请使用ec2-user登录”的行中看到错误味精。一旦我以ec2-user身份进行了git克隆,那就很好了。


1

我有时也会遇到该错误,但是当它出现时,这意味着我的分支不是最新的,所以我必须这样做 git pull origin <current_branch>


1

如果您还没有私钥身份验证设置,则Git不会提示输入密码,并且会失败,并显示类似的错误消息“致命:协议错误:错误的行长字符:用户” 。

https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server告诉您如何在服务器上指定公钥。基本上将公钥添加到〜/ .ssh / authorized_keys或〜/ .ssh / authorized_keys2

我不得不为如何在Windows机器上为Git Bash提供私钥而苦苦挣扎。丹·麦克莱恩(Dan McClain)在/server/194567/how-do-i-tell-git-for-windows-where-to-find-my-private-rsa-key/382801#382801中的回答对此进行了描述。除了他的答案外,在我的情况下,私钥文件应命名为id_rsa.pub。


1

对我来说,使用私有密钥(用puttygen转换)将相同的主机详细信息添加到Putty中是可行的。之后的所有git bash命令都没有问题。


1

如果使用腻子。然后确保运行Pageant,并且您的私钥已加载到Pageant中(鼠标右键单击任务栏上的Pageant图标,然后在弹出的菜单上单击“查看密钥”)。

否则,当您在cmd.exe中执行操作时:

git clone ssh://name@host:/path/to/git/repo.git

您收到此消息“致命:协议错误:错误的行长字符:”


1

TL; DR:待办事项不能忽略username@在远程URL在Windows上时。

在具有默认ssh的Linux和Windows上,可以从远程URL中省略用户名,如下所示:

git clone server-name:/srv/git/repo-name

因为ssh的默认行为是仅使用您当前登录时使用的任何用户名。如果您使用的是Windows,并且已设置git以便使用plink.exe,则可以使用加载到的密钥pageant,则此方法将不起作用,因为plink它没有相同的自动用户名行为,从而导致出现那些隐秘的错误消息,因为它将提示输入用户名:

$ plink server-name
login as: _

与:

$ plink username@server-name
...logs you in...

如果您已经以某种方式克隆了存储库,则可以.git/config通过将username@远程目录添加到远程URL 来修复其中的远程目录。


通过添加用户名到远程git remote set-url origin myusername@...帮助了我。
Maxim Suslov

0

检查服务器上是否允许Shell访问。


我的是“嗨克”。原来,我关注了一些Security Setup网站,现在我的git登录显示“嗨,git!您已成功通过身份验证,但我不提供交互式shell访问。”。猜猜我得把那个删除....
唐明亮

0

错误转换为:致命:协议错误:行长错误字符:fata

将git-upload-pack的位置添加到系统路径后。

问题似乎是在存储库名称周围添加了撇号:使用git客户端添加的诸如Process Monitor之类的工具(来自sys内部)。这似乎是一个特定于git的Windows问题。

我在服务器的提示符下尝试了相同的命令行:完全错误是“致命的:没有给定的存储库(或任何父目录):. git”

总之,在我看来,这似乎是一个软件错误。请注意,我不是git专家,这是我第一次使用git,我来自于subversion和perforce。


0

我们也遇到了这个问题。

Counting objects: 85, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (38/38), 3.38 KiB | 0 bytes/s, done.
Total 38 (delta 33), reused 0 (delta 0)
Auto packing the repository for optimum performance.
fatal: protocol error: bad line length character: Remo
error: error in sideband demultiplexer

我不知道发生了什么问题的麻烦细节,但是在我们的案例中,触发它的原因是服务器上的磁盘已满。


0

这可能是您计算机上的安全访问权限,您是否正在运行Pageant(这是腻子代理)?


0

您总是可以将http链接链接到您的git项目。您可以使用它代替ssh链接。这只是您的选择


0

好吧,我遇到了同样的问题(Windows 7)。尝试通过密码获取回购。我使用Git Bash + Plink(环境变量GIT_SSH)+ Pageant。删除GIT_SSH(临时)对我有帮助。我不知道为什么我不能同时使用通过登录和RSA登录...


0

此处的答案较晚,但希望对您有所帮助。如果它是协议错误,它必须对您本地的git进行一些操作,使其无法与远程git通信。如果您通过ssh克隆了存储库,并且稍后某个时候,您丢失了存储库的密钥,或者您的ssh代理无法再找到这些密钥,则会发生这种情况。

  1. 生成一个新密钥,并将其添加到您的git repo中,或配置ssh代理以加载密钥(如果您仍然拥有密钥,而不是其他人;)

  2. 另一个快速修复方法是转到.git目录,然后从到编辑config文件,这样就无需按下ssh键,它将还原为询问您的用户名和密码。[remote "origin"] urlgithttp

    [remote "origin"]
    url = git@gitlab.*****.com:****/****.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    

改成

    [remote "origin"]
    url = http://gitlab.*****.com/****/****.git
    fetch = +refs/heads/*:refs/remotes/origin/*

0

在设置/版本控制/ git下将ssh可执行程序从内置更改为nativ,这对我来说很成功。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.