我正在尝试从R脚本中自动化一些基本的git操作。我在Windows OS上使用Rstudio。例如,如果您希望在脚本完成一些自动化任务后更新GitHub,这可能会有所帮助。

我编写了一些简单的函数,这些函数利用R的shell()函数和Window的&管道运算符将命令链发送到OS终端:

# Git status.
gitstatus <- function(dir = getwd()){
  cmd_list <- list(
    cmd1 = tolower(substr(dir,1,2)),
    cmd2 = paste("cd",dir),
    cmd3 = "git status"
  )
  cmd <- paste(unlist(cmd_list),collapse = " & ")
  shell(cmd)
}

# Git add.
gitadd <- function(dir = getwd()){
  cmd_list <- list(
    cmd1 = tolower(substr(dir,1,2)),
    cmd2 = paste("cd",dir),
    cmd3 = "git add --all"
  )
  cmd <- paste(unlist(cmd_list),collapse = " & ")
  shell(cmd)
}

# Git commit.
gitcommit <- function(msg = "commit from Rstudio", dir = getwd()){
  cmd_list <- list(
    cmd1 = tolower(substr(dir,1,2)),
    cmd2 = paste("cd",dir),
    cmd3 = paste0("git commit -am ","'",msg,"'")
  )
  cmd <- paste(unlist(cmd_list),collapse = " & ")
  shell(cmd)
}

# Git push.
gitpush <- function(dir = getwd()){
  cmd_list <- list(
    cmd1 = tolower(substr(dir,1,2)),
    cmd2 = paste("cd",dir),
    cmd3 = "git push"
  )
  cmd <- paste(unlist(cmd_list),collapse = " & ")
  shell(cmd)
}

我的gitstatusgitaddgitpush函数可以正常工作。 gitcommit函数不起作用。它生成以下错误:



之所以可以使用gitpush函数,是因为如果您在Rstudio中切换到终端或git,则可以提交更改,然后成功调用gitpush

关于如何解决此问题的任何想法?

...

注意:我已经安装了Git bash,并且可以从Windows命令终端和Rstudio成功使用git。我还尝试了另一种策略,即让R编写一个临时的.bat文件,然后执行该文件,但是该策略也卡在了提交步骤上。

最佳答案



答案位于Dirk Eddelbuettel's drat 包函数addrepo中。还必须使用git2r's config函数来确保git能够识别R。git2r的函数可能会为将来使用R脚本中的git提供更健壮的解决方案。同时,这是我解决问题的方法。

  • 安装git2r。使用git2r::config()确保git能够识别R.
  • 从Dirk的代码中,我修改了gitcommit()函数以利用sprintf()system()执行系统命令:
  • # Git commit.
    gitcommit <- function(msg = "commit from Rstudio", dir = getwd()){
      cmd = sprintf("git commit -m\"%s\"",msg)
      system(cmd)
    }
    

    Sprintf的输出如下所示:
    [1] "git commit -m\"commit from Rstudio\""
    


    #install.packages("git2r")
    library(git2r)
    
    # Insure you have navigated to a directory with a git repo.
    dir <- "mypath"
    setwd(dir)
    
    # Configure git.
    git2r::config(user.name = "myusername",user.email = "myemail")
    
    # Check git status.
    gitstatus()
    
    # Download a file.
    url <- "https://i.kym-cdn.com/entries/icons/original/000/002/232/bullet_cat.jpg"
    destfile <- "bullet_cat.jpg"
    download.file(url,destfile)
    
    # Add and commit changes.
    gitadd()
    gitcommit()
    
    # Push changes to github.
    gitpush()
    
    

    好吧,图片看起来很古怪,但是我想你明白了。

    07-24 13:17