代码之家  ›  专栏  ›  技术社区  ›  brunoais

git克隆工作;git子模块失败“权限被拒绝”

  •  24
  • brunoais  · 技术社区  · 6 年前

    在gitlab的私有存储库上运行时 git clone git@git.privateserver.local:group/project-submodule.git 克隆成功完成。
    作为克隆过程的一部分, 有人问我 获取我私钥的密码短语。

    当我跑步时 submodule update --init "group/project-submodule"
    出现以下故障:

    权限被拒绝,请重试。 权限被拒绝,请重试。 权限被拒绝(publickey、gssapi keyex、gssapi with mic、password)。 致命:无法从远程存储库读取。

    在尝试处理子模块获取时, 没人问我 获取我私钥的密码短语。

    (我不得不匿名)

    致命:克隆'git@git.privateserver.local:组/项目子模块。git“into submodule path”C:/Users/user/repos/project module/project submodule失败

    我已经检查了 .gitmodules 文件,它包含正确的数据(我认为可以通过错误消息确认)。

    引起我注意的主要因素是没有要求我提供私钥密码短语。更奇怪的是,当我使用 git clone 它直接按预期运行。

    我还通过访问 ssh 它要求我输入密码短语,就像我执行拉取或克隆时一样

    使用git for windows“git版本2.16.2.windows.1”

    6 回复  |  直到 6 年前
        1
  •  29
  •   lukas-reineke    6 年前

    Git尝试使用ssh而不是https克隆子模块。 如果尚未配置ssh密钥,则此操作将失败。
    您可以设置ssh代理来缓存ssh密钥的密码,并让git使用该密码。或更改为https。
    Git在子模块方面有点混乱。它们在中配置 .gitmodules 文件,但将此处的url从ssh更改为https将无济于事。Git使用中配置的url .git/config
    打开此文件,您将发现类似的内容。

    [submodule "project-submodule"]
        url = git@example.com:project-submodule.git
    

    请将此url更改为等效的https,然后重试。

        2
  •  5
  •   brunoais    6 年前

    您还可以将ssh密钥更改为不需要密码短语的密钥。我也有同样的问题现在 git submodule update --init --recursive 使用无密码短语后效果良好。

    这似乎是Windows git中的一个bug,当它更新子模块时,它不要求提供解释密钥。(git版本2.19.1.windows.1)

        3
  •  3
  •   Andreas Raster    6 年前

    lukas reineke的回答正确地描述了问题以及使用 ssh-agent 启用git子模块的克隆,这些子模块的配置应确保它们应该通过ssh而不是https进行克隆。

    作为使用 ssh代理 你可以用油灰 pageant 。这样,您可以将git存储库所在的主机配置为putty中保存的会话,然后使用以下命令克隆子模块:

    set GIT_SSH=plink & git submodule update
    

    当然你必须确保 plink.exe 可以在您的 %PATH% ,并且您已将私钥添加到运行 盛会 实例(应该有一个小systray图标,您可以单击它“添加密钥”)。

    自从 ssh代理 要从本机cmd正确运行可能有点棘手。我发现这个替代方法非常有用。

        4
  •  3
  •   SharadG    4 年前

    我也面临着同样的问题。在下载子模块时,GIT不要求提供ssh密钥密码,这就是问题所在。

    创建新ssh密钥 无密码短语 为我工作。

        5
  •  3
  •   Dinsdale    4 年前

    问题似乎是OpenSSH 3.8抛出了一个无法从win32访问的对话框?

    如果切换到Git Bash(默认使用Git安装),则会弹出对话框,您可以输入私钥密码。

    正如其他人所指出的,另一种方法是使用putty并设置plink来与ssh协作。我通常使用这种方法,它在选美比赛中完美无瑕。棘手的部分是设置plink: https://makandracards.com/makandra/1303-how-to-use-git-on-windows-with-putty

    * 更新:我试过油灰/选美,但没能成功。jenkins git插件传递的选项与pageant不兼容。

    但是,查找对话框对我的Jenkins设置没有帮助。。。

    enter image description here

        6
  •  2
  •   brunoais    3 年前

    我遇到了相同的错误消息,但原因/解决方案不同:

    太长,读不下去了

    我需要跑步 export GIT_SSH_COMMAND='ssh -i ~/.ssh/some_ssh_id' 在子模块命令之前。

    详细信息

    我的存储库使用自定义ssh文件,即我有一个个人密钥( .ssh/id_rsa )以及特定于公司的仅限git的密钥( .ssh/company_git_id )。Git默认使用 id_rsa 密钥,它无权访问git存储库。

    以下调整使git可以使用特定于公司的git密钥:

    # Sets the SSH key of the repository to `company_git_id`:
    git config core.sshCommand 'ssh -i ~/.ssh/company_git_id'
    git fetch # works!
    
    # The config.sshCommand does not work for submodules. Use this instead:
    export GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id'
    git submodule update --rebase --remote my_module_dir # works!
    

    请注意,这将更改您运行的所有以下命令的GIT\u SSH\u命令。

    要使此环境更改无效,可以在子shell中运行子模块请求,如下所示:

    (export GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id' && git submodule update --rebase --remote my_module_dir)
    

    或者对于Bash和zsh这样的shell,不需要子shell

    GIT_SSH_COMMAND='ssh -i ~/.ssh/company_git_id' git submodule update --rebase --remote my_module_dir