使用R将本地repo推送到Windows上的github

我曾经问过一个非常类似的问题,并得到了一个从命令行工作的响应,但是现在想用R来自动化从Windows进程(Linux更容易)。

这是我想要做的:

  1. 创build一个本地目录(或已经存在)
  2. 在云中生成一个新的github回购与本地相同的名称( 基于这个答案 )
  3. 添加一个.git到本地仓库
  4. 进行初始提交
  5. build立云回购和本地回购之间的联系
  6. 将提交和本地仓库中的文件推送到github

我相信根据输出结果 ,在我失败之前,我会一路走到第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。

Solutions Collecting From Web of "使用R将本地repo推送到Windows上的github"

如果正在使用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% 

但是你也可以手动完成。

这个问题似乎混合了sshhttps协议。

请注意,网址应该是:

 # 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)