Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Go中禁用git克隆的凭据提示?_Git_Go - Fatal编程技术网

如何在Go中禁用git克隆的凭据提示?

如何在Go中禁用git克隆的凭据提示?,git,go,Git,Go,我试图在Go中运行与git clone相当的git,但如果系统提示输入stdin,我想退出命令(例如:如果远程存储库中没有设置ssh密钥,则进行身份验证)。有办法做到这一点吗?现在,它只需阻塞输入。更新:特殊的git解决方案 由于v2.3git支持环境设置git_TERMINAL_PROMPT=0,即不请求凭据但失败 func main() { cmd := exec.Command("git", "clone", "https://github.com/some/non-existin

我试图在Go中运行与git clone相当的
git
,但如果系统提示输入stdin,我想退出命令(例如:如果远程存储库中没有设置ssh密钥,则进行身份验证)。有办法做到这一点吗?现在,它只需阻塞输入。

更新:特殊的git解决方案

由于v2.3git支持环境设置
git_TERMINAL_PROMPT=0
,即不请求凭据但失败

func main() {
    cmd := exec.Command("git", "clone", "https://github.com/some/non-existing-repo")
    os.Setenv("GIT_SSH_COMMAND", "ssh -oBatchMode=yes")  // 
    cmd.Env = append(os.Environ(), "GIT_TERMINAL_PROMPT=1", "GIT_SSH_COMMAND='ssh -oBatchMode=yes'")

    cmd.Stdout = os.Stdout
    err := cmd.Run()
    if err != nil {
        log.Println("Error: ", err)
    }
} 
SSH解决方案: 接受的答案仅适用于http克隆。如果您希望通过ssh实现这一点,那么以下方法将起作用:

//禁用stdin提示输入用户名/密码。如果未配置无密码ssh,我们希望失败
Setenv(“GIT\u SSH\u命令”,“SSH-oBatchMode=yes”)
cmd:=exec.Command(名称、参数…)
return cmd.CombinedOutput()
mangit
git\u SSH\u命令的条目

如果设置了这些环境变量中的任何一个,那么git fetch和git push将使用 当需要连接到远程系统时,指定命令而不是ssh。命令将 只给出两个或四个参数:username@host(或只是主机)从URL和 在远程系统上执行的shell命令,可以选择前面加-p(字面意思)和 当指定默认SSH端口以外的其他端口时,从URL中选择端口

$GIT_SSH_命令优先于$GIT_SSH,并由shell解释,它允许 要包括的其他参数$另一方面,GIT_SSH必须正好是 程序(如果需要其他参数,可以是包装器外壳脚本)

通常,通过personal.ssh/config文件更容易配置所需的选项。 有关更多详细信息,请参阅ssh文档

mangit
输入
git\u终端\u提示符

如果此环境变量设置为0,git将不会在终端上提示(例如,当 请求HTTP身份验证)


一个使用git的本地golang解决方案怎么样。这意味着您的程序将不需要git,也不会有stdin和git二进制文件的问题。从中签出此示例。另外一个好处是,文档非常好,这是从项目的页面。它还支持ssh协议。下面是git与这个项目的对比

import (
    "fmt"
    "os"

    "gopkg.in/src-d/go-git.v4"
    . "gopkg.in/src-d/go-git.v4/_examples"
)

// Basic example of how to clone a repository using clone options.
func main() {
    url := "https://github.com/some/non-existing-repo"
    directory := "/foo/bar"

    // Clone the given repository to the given directory
    Info("git clone %s %s --recursive", url, directory)

    r, err := git.PlainClone(directory, false, &git.CloneOptions{
        URL:               url,
        RecurseSubmodules: git.DefaultSubmoduleRecursionDepth,
    })

    CheckIfError(err)  

}

您是否尝试将
nil
传递给Stdin?还请用CommandContext和StdinPipe检查下面的示例。@EugeneLisitsky是的,通过nil没有任何作用。golang.org/pkg/os/exec/#Cmd.StdinPipe似乎关闭StdinPipe可以防止命令阻塞我仍然会收到密码提示。请将您的解决方案作为答案发布,而不是作为问题的编辑。这很有效,唯一的问题是
Read()
即使没有提示输入,也会被调用,因此即使没有提示输入密码,它也会从技术上中止git clone op。我几乎写了这个答案,但我先仔细检查了文档。这确实行不通。我没能想出一个有效的解决方案,但我也没怎么努力。。。(如果它不工作,为什么会被标记为接受?)我选中了-是
git
尝试读取stdin,即使它不需要。所以我们需要一种方法来区分这种情况。@MiloChristiansen我认为它确实有效,所以我给了它一个接受的答案answer@EugeneLisitsky您发布的特定评论仅对https克隆有效。然而,在帖子中也有关于ssh的有用评论。为了禁用stdin,可以在运行克隆之前设置
os.Setenv(“GIT\u SSH\u命令”,“SSH-oBatchMode=yes”)
。你想更新你的答案,我会给你接受的答案吗?