我试图在R脚本中自动化一些基本的git操作。我在Windows操作系统上使用Rstudio。例如,如果您希望在脚本完成某些自动任务时更新GitHub,这可能会有所帮助。
我编写了一些简单的函数,利用R的shell()函数和窗口的&管道操作符向操作系统终端发送一系列命令:
# 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)
}我的gitstatus、gitadd和gitpush函数可以工作。gitcommit函数不能工作。它会产生以下错误:
致命:使用-a的路径没有意义。 警告信息: 在shell(cmd):'d:& cd _ D:/Documents/R/my_path & git提交-am‘从Rstudio’提交‘失败,错误代码128
gitpush函数可以工作,因为如果您切换到Rstudio中的终端或git,您可以提交更改,然后成功地调用gitpush。
关于如何解决这个问题,有什么想法吗?
..。
注意:我安装了Git,我可以成功地使用命令终端和。我还尝试了另一种策略,即让R编写一个临时.bat文件,然后执行这个文件,但是这个策略在提交步骤上也会被挂起。
发布于 2019-03-31 14:31:51
解决方案
答案在德克·埃德尔贝特尔氏 drat包函数阿德雷波中。还需要使用git2r's config函数来确保git识别R. git2r函数,这可能为将来使用R脚本中的git提供更健壮的解决方案。同时,我是如何解决这个问题的。
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()嗯,这张照片看上去很不稳定,但我想你明白重点了。
发布于 2019-03-30 14:41:57
根据我在这问Ubuntu问题中看到的内容,您应该使用&&而不是&来分离Git中的多个命令。试着这样做:
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函数将输出如下所示:
/v & cd /var/www/service/usercode/255741827 & git commit -am 'first commit'"我不知道substr(dir, 1, 2)部分有什么用途,但是如果我的建议仍然不起作用,那么尝试删除它,只留下cd和git commit命令。
发布于 2021-05-26 06:39:42
我个人喜欢来自rOpenSci的rOpenSci包的语法和简单性。具体来说,要执行回购,您应该这样做:
git_add("test.txt")
git_commit("Adding a file", author = "jerry <jerry@gmail.com>")顶推到遥控器:
git_push(remote = "origin", repo = ".")并使用这个简单的语法查看所有其他有用的函数。
https://stackoverflow.com/questions/55432420
复制相似问题