V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LxnChan
V2EX  ›  问与答

求问一下 git 提交时报错 invalid format 怎么解

  •  
  •   LxnChan · 284 天前 · 650 次点击
    这是一个创建于 284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我本地有个 git 仓库,remote 地址是 ssh 形式([email protected]:xxx/xxx.git),采用密钥对的方式登录。

    近两天重做了系统,之前的 Key (C:\Users\Username\.ssh整个文件夹)都被存放在了一个很安全的存储设备里面。重做系统后把之前备份的密钥对还原到了上述路径,之后登录业务主机没有影响。

    但是今天改了点代码,想到好多天没上传了,寻思 Push 一下,结果报错:

    Username@ComputerName MINGW64 /d/projectA (main)
    $ git push -u origin main
    Load key "/c/Users/Username/.ssh/id_rsa": invalid format
    [email protected]: Permission denied (publickey).
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    还以为是 Key 的问题,但是测试了 Key 是能打印出来的

    Username@ComputerName MINGW64 /d/projectA (main)
    $ cat /c/Users/Username/.ssh/id_rsa
    -----BEGIN OPENSSH PRIVATE KEY-----
     [正确的 Key 内容] 
    -----END OPENSSH PRIVATE KEY-----
    

    测试在 git bash 中不通过

    Username@ComputerName MINGW64 /d/projectA (main)
    $ ssh -T [email protected]
    Load key "/c/Users/Username/.ssh/id_rsa": invalid format
    [email protected]: Permission denied (publickey).
    

    但在 cmd (非管理员权限)中正常

    Microsoft Windows [版本 10.0.19045.2965]
    (c) Microsoft Corporation 。保留所有权利。
    
    C:\Users\Username>ssh -T [email protected]
    Hi Username! You've successfully authenticated, but GitHub does not provide shell access.
    

    直接就是一个白丝不得其解,VSCode 里面也没办法正常推送,感觉是权限问题,但是权限上看着又没啥问题,想问问大家有没有什么头绪,先谢过了。

    6 条回复    2023-07-18 10:54:11 +08:00
    ManUnDead
        1
    ManUnDead  
       284 天前 via Android
    是不是本地.ssh 目录里存放的公钥有问题,我记着之前踩过的一个坑是本地居然会对 pub 公钥和私钥进行校验
    hsfzxjy
        2
    hsfzxjy  
       284 天前
    你看这里有没有中的 https://serverfault.com/questions/854208/ssh-suddenly-returning-invalid-format

    另外,“白丝不得其解” 🤣🤣🤣
    LxnChan
        3
    LxnChan  
    OP
       284 天前
    @ManUnDead 密钥对是没问题的,能正常 ssh 登录其他主机
    forcecharlie
        4
    forcecharlie  
       284 天前
    你这个问题可能的解决方案有两种:
    第一种看文件的属性,Git for Windows ( MINGW64 )的 SSH 可能要求 SSH 私钥的 filemode 是 0600 ,你可以在 Git for Windows (MINGW64) 的 bash 中 stat /c/Users/Username/.ssh/id_rsa ,如果不正确,则使用 chmod 0600 /c/Users/Username/.ssh/id_rsa 然后重试。
    第二种是看文件换行符,Git for Windows ( MINGW64 )的 SSH 需要 LF 的换行符,而 Windows 移植的 SSH 可能能处理 CRLF ,将私钥的换行符换回去就可以了。

    在 cmd 中的 SSH 实际上是微软 PowerShell 团队移植的 [OpenSSH]( https://github.com/PowerShell/Win32-OpenSSH),与 Git for Windows ( MINGW64 )的并不一致。

    这里我也只是做个推测,并没有验证。
    xiri
        5
    xiri  
       284 天前 via Android
    建议检查一下你的 id_rsa 文件中的换行符,如果是 CRLF (\r\n )换行就会出现 cmd 正常( windows 自带的 ssh )但是 git bash 出现 invalid format 的情况
    LxnChan
        6
    LxnChan  
    OP
       284 天前
    @forcecharlie @xiri
    刚看了一下确实是公私钥都是 CRLF ,刚才也解决了
    那么我是怎么解决的呢?
    我在 git 官网上重新下载了 Windows 版的 Git ,寻思死马当活马医,在中间有一步选 OpenSSH 库,要求选内置还是 Windows 自带,我选了 Windows 自带,于是就能正常提交了。
    现在看来应该就是换行符的问题,总之谢谢了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2746 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:21 · PVG 18:21 · LAX 03:21 · JFK 06:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.