15

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

这是我正在尝试做的事情:

  1. 创建本地目录(或已存在)
  2. 在云端生成一个与本地同名的新 github 存储库(基于此答案
  3. 将 .git 添加到本地仓库
  4. 进行初始提交
  5. 在云存储库和本地存储库之间建立链接
  6. 将本地 repo 中的提交和文件推送到 github

我相信基于我在失败之前一直到第 5 步的输出(因为本地目录中的提交和文件永远不会转到云中的 github)。我知道第 2 步有效,因为这里创建了空仓库。我不知道如何测试第 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)

我知道脚本有点长,但重新创建问题并复制问题都是必要的:

请注意,我根据西蒙的回答更新了问题,因为他是正确的并且更接近推动。原始问题的内容可以在这里找到。

4

2 回答 2

8

如果使用 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) 

这比设置 public/private ssh keys更容易。


正如OP Tyler Rinker 评论的那样,设置%HOME%在我的另一个答案“ Git - 如何.netrc在 Windows 上使用文件保存用户和密码”中进行了说明。
这通常由git-cmd.bat完成:

if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

但您也可以手动完成。

于 2013-09-09T06:12:50.543 回答
2

问题似乎只是混淆了ssh协议https

请注意,URL 应为:

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

cmdStat <- paste0(shQuote(gitpath), " status")  
shell(cmdStat, intern = T)
于 2013-09-06T12:11:33.223 回答