首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从R脚本中向GitHub提交更改?

如何从R脚本中向GitHub提交更改?
EN

Stack Overflow用户
提问于 2019-03-30 14:29:22
回答 3查看 1.8K关注 0票数 7

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

我编写了一些简单的函数,利用R的shell()函数和窗口的&管道操作符向操作系统终端发送一系列命令:

代码语言:javascript
复制
# 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函数不能工作。它会产生以下错误:

致命:使用-a的路径没有意义。 警告信息: 在shell(cmd):'d:& cd _ D:/Documents/R/my_path & git提交-am‘从Rstudio’提交‘失败,错误代码128

gitpush函数可以工作,因为如果您切换到Rstudio中的终端或git,您可以提交更改,然后成功地调用gitpush

关于如何解决这个问题,有什么想法吗?

..。

注意:我安装了Git,我可以成功地使用命令终端和。我还尝试了另一种策略,即让R编写一个临时.bat文件,然后执行这个文件,但是这个策略在提交步骤上也会被挂起。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-31 14:31:51

解决方案

答案在德克·埃德尔贝特尔氏 drat包函数阿德雷波中。还需要使用git2r's config函数来确保git识别R. git2r函数,这可能为将来使用R脚本中的git提供更健壮的解决方案。同时,我是如何解决这个问题的。

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

Sprintf的输出如下所示:

代码语言:javascript
复制
[1] "git commit -m\"commit from Rstudio\""

示例

代码语言:javascript
复制
#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()

嗯,这张照片看上去很不稳定,但我想你明白重点了。

票数 3
EN

Stack Overflow用户

发布于 2019-03-30 14:41:57

根据我在这问Ubuntu问题中看到的内容,您应该使用&&而不是&来分离Git中的多个命令。试着这样做:

代码语言:javascript
复制
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)
}

注意,您的gitcommit函数将输出如下所示:

代码语言:javascript
复制
/v & cd /var/www/service/usercode/255741827 & git commit -am 'first commit'"

我不知道substr(dir, 1, 2)部分有什么用途,但是如果我的建议仍然不起作用,那么尝试删除它,只留下cdgit commit命令。

票数 0
EN

Stack Overflow用户

发布于 2021-05-26 06:39:42

我个人喜欢来自rOpenSci的rOpenSci包的语法和简单性。具体来说,要执行回购,您应该这样做:

代码语言:javascript
复制
git_add("test.txt")
git_commit("Adding a file", author = "jerry <jerry@gmail.com>")

顶推到遥控器:

代码语言:javascript
复制
git_push(remote = "origin", repo = ".")

并使用这个简单的语法查看所有其他有用的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55432420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档