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

时间:2017-09-27 05:18:45

标签: git go

我正在尝试在Go中运行等效的git clone,但是如果提示输入stdin,我想退出命令(例如:如果未在ssh中设置ssh密钥,则验证远程存储库)。有没有办法做到这一点?现在它只会阻止输入。

3 个答案:

答案 0 :(得分:1)

如何使用git替代原生golang解决方案。这意味着你的程序不需要git,你就不会遇到stdin和git二进制文件的问题。从https://godoc.org/gopkg.in/src-d/go-git.v4查看此示例。一个优点是文档非常好,这是来自项目的examples页面。它还支持ssh协议。这是一个full comparison git vs这个项目。

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)  

}

答案 1 :(得分:0)

更新:特殊的git解决方案。

由于v 2.3 git支持环境设置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)
    }
} 

答案 2 :(得分:0)

SSH解决方案:

接受的答案仅适用于http克隆。如果你想用ssh做这个方法,下面的方法就可以了:

//disables stdin prompts for username/password. If passwordless-ssh isn't configured we want to fail
os.Setenv("GIT_SSH_COMMAND", "ssh -oBatchMode=yes") 
cmd := exec.Command(name, args...)
return cmd.CombinedOutput()
man git

GIT_SSH_COMMAND条目

  

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

     

$ GIT_SSH_COMMAND优先于$ GIT_SSH,并由shell解释,允许              要包括的其他参数。另一方面,$ GIT_SSH必须只是a的路径              程序(如果需要其他参数,可以是包装shell脚本)。

     

通常可以通过个人.ssh / config文件更轻松地配置任何所需选项。             有关详细信息,请参阅ssh文档。

man git

GIT_TERMINAL_PROMPT条目

  

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