我曾经问过一个非常类似的问题,并得到了一个从命令行工作的响应,但是现在想用R来自动化从Windows进程(Linux更容易)。
这是我想要做的:
我相信根据输出结果 ,在我失败之前,我会一路走到第5步(因为本地目录中的提交和文件永远不会去到云中的github)。 我知道步骤2的作品,因为在这里创build空的回购。 我不知道如何testing第5步。最后一步shell(cmd6, intern = T)
RGui和RStudio会导致永恒的死亡螺旋。 问题是: 如何将提交和本地回购推送到云。
这里是我更新的代码( 用户特定的唯一的用户名和密码在第三个代码块 ):
## Create Directory repo <- "foo5" dir.create(repo) project.dir <- file.path(getwd(), repo) ## Throw a READ.ME in the directory cat("This is a test", file=file.path(project.dir, "READ.ME")) ## Github info (this will change per user) password <-"pass" github.user <- "trinker" ## Get git location test <- c(file.exists("C:/Program Files (x86)/Git/bin/git.exe"), file.exists("C:/Program Files/Git/bin/git.exe")) gitpath <- c("C:/Program Files (x86)/Git/bin/git.exe", "C:/Program Files/Git/bin/git.exe")[test][1] ## download curl and set up github api wincurl <- "http://curl.askapache.com/download/curl-7.32.0-win64-ssl-sspi.zip" url <- wincurl tmp <- tempfile( fileext = ".zip" ) download.file(url,tmp) unzip(tmp, exdir = tempdir()) shell(paste0(tempdir(), "/curl http://curl.haxx.se/ca/cacert.pem -o " , tempdir() , "/curl-ca-bundle.crt")) json <- paste0(" { \"name\":\"" , repo , "\" } ") #string we desire formatting json <- shQuote(json , type = "cmd" ) cmd1 <- paste0( tempdir() ,"/curl -i -u \"" , github.user , ":" , password , "\" https://api.github.com/user/repos -d " , json ) shell(cmd1, intern = T) ## Change working directory wd <- getwd() setwd(project.dir) ## set up the .git directory cmd2 <- paste0(shQuote(gitpath), " init") shell(cmd2, intern = T) ## add all the contents of the directory for tracking cmd3 <- paste0(shQuote(gitpath), " add .") shell(cmd3, intern = T) cmdStat <- paste0(shQuote(gitpath), " status") shell(cmdStat, intern = T) ## Set email (may not be needed) Trim <- function (x) gsub("^\\s+|\\s+$", "", x) #remove trailing/leading white x <- file.path(path.expand("~"), ".gitconfig") if (file.exists(x)) { y <- readLines(x) email <- Trim(unlist(strsplit(y[grepl("email = ", y)], "email ="))[2]) } else { z <- file.path(Sys.getenv("HOME"), ".gitconfig") if (file.exists(z)) { email <- Trim(unlist(strsplit(y[grepl("email = ", y)], "email ="))[2]) } else { warning(paste("Set `email` in", x)) } } cmdEM <- paste0(shQuote(gitpath), sprintf(" config --global user.email %s", email)) system(cmdEM, intern = T) ## Initial commit cmd4 <- paste0(shQuote(gitpath), ' commit -m "Initial commit"') system(cmd4, intern = T) ## establish connection between local and remote cmd5 <- paste0(shQuote(gitpath), " remote add origin https://github.com/", github.user, "/", repo, ".git") shell(cmd5, intern = T) ## push local to remote cmd6 <- paste0(shQuote(gitpath), " push -u origin master") shell(cmd6, intern = T) setwd(wd)
我知道脚本有点长,但是重新创build问题并复制问题都是必须的:
注意我根据Simon的回答更新了这个问题,因为他是正确的,并且接近了推动。 原始问题的内容可以在这里find。
如果正在使用https地址,请确保:
%HOME%
_netrc
文件存在与正确的凭据推回到您的回购 该文件应包含:
machine github.com login username password xxxx protocol https
即使您在GitHub上激活了最近的双因素身份验证,也是如此 。
那么你的推动将不会超时:
cmd6 <- paste0(shQuote(gitpath), " push -u origin master") shell(cmd6, intern = T)
这比设置公共/私人ssh密钥更容易。
正如OP Tyler Rinker 所说 ,设置%HOME%
在我的其他答案“ Git – 如何在Windows上使用.netrc
文件以保存用户和密码 ”中说明。
这通常由git-cmd.bat完成 :
if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH% @if not exist "%HOME%" @set HOME=%USERPROFILE%
但是你也可以手动完成。
这个问题似乎混合了ssh
和https
协议。
请注意,网址应该是:
# https: "https://github.com/<username>/<myrepo>.git" # ssh: "git@github.com:<username>/<repo>.git"
你有:
cmd5 <- paste0(shQuote(gitpath), " remote add origin https://github.com:", github.user, "/", repo, ".git") cat( cmd5 ) "... remote add origin https://github.com:trinker/foo2.git"
只需将cmd5
更改为
# Note the forward slash at EOL in place of the colon cmd5 <- paste0(shQuote(gitpath), " remote add origin https://github.com/", github.user, "/", repo, ".git") "... remote add origin https://github.com/trinker/foo2.git"
在git add .
后立即运行它也不会受到伤害git add .
:
cmdStat <- paste0(shQuote(gitpath), " status") shell(cmdStat, intern = T)