使用R将本地存储库推送到Windows上的github

时间:2013-09-06 02:03:43

标签: windows r git github-api

我曾经问了一个非常similar question并得到了一个从命令行起作用的响应,但现在我想使用R从Windows自动化这个过程(Linux更容易)。

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

  1. 创建本地目录(或已存在)
  2. 在云中生成一个与本地(based on this answer)同名的新github仓库
  3. 将.git添加到本地仓库
  4. 进行初步提交
  5. 建立云回购和本地回购之间的链接
  6. 将提交和本地存储库中的文件推送到github
  7. 我相信based on the output我在失败前一直到第5步(因为提交和本地目录中的文件永远不会转到云中的github)。我知道第2步有效,因为创建了空仓库here。我不知道如何测试第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)
    

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

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

2 个答案:

答案 0 :(得分:8)

如果使用https地址,请确保:

  • 定义了环境变量%HOME%
  • 其中存在_netrc文件,其中包含正确的凭据以回送到您的仓库

该文件应包含:

machine github.com
login username
password xxxx
protocol https

即使您有activated the recent two-factor authentication on GitHub,也可以。

然后你的推动不会超时:

cmd6 <- paste0(shQuote(gitpath), " push -u origin master")  
shell(cmd6, intern = T) 

这比setting public/private ssh keys更容易。


作为OP Tyler Rinker commented,我的其他答案“Git - How to use .netrc file on windows to save user and password”中说明了设置%HOME%
这通常由git-cmd.bat完成:

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

但你也可以手动完成。

答案 1 :(得分:2)

问题似乎只是混淆了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 .之后立即运行它也不会有害:

cmdStat <- paste0(shQuote(gitpath), " status")  
shell(cmdStat, intern = T)