我正在尝试在Go中运行等效的git clone
,但是如果提示输入stdin,我想退出命令(例如:如果未在ssh中设置ssh密钥,则验证远程存储库)。有没有办法做到这一点?现在它只会阻止输入。
答案 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)
接受的答案仅适用于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身份验证)。