我正在尝试从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)
}
我的gitstatus
,gitadd
和gitpush
函数正常工作。 gitcommit
函数不起作用。它会产生以下错误:
致命的:-a路径没有意义。
警告信息:
在shell(cmd)中:'d:&cd D:/ Documents / R / my_path&git commit -am'commit from Rstudio'执行失败,错误代码为128
gitpush
函数之所以起作用,是因为如果您在Rstudio中切换到终端或git,则可以提交更改,然后成功调用gitpush
。
关于如何解决此问题的任何想法?
...
注意::我已经安装了Git bash,并且可以从Windows命令终端和Rstudio成功使用git。我还尝试了另一种策略,即让R写入一个临时.bat
文件,然后执行该文件,但是该策略也挂在了提交步骤上。
答案 0 :(得分:0)
根据我在this Ask Ubuntu question中所读的内容,应该使用&&
而不是&
来分隔Git bash中的多个命令。尝试这样做:
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
命令。
答案 1 :(得分:0)
答案位于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()
好吧,图片看起来很古怪,但是我想你明白了。
答案 2 :(得分:0)
我个人喜欢 rOpenSci 的 gert
包的语法和简单性。具体来说,要提交一个回购,你会这样做:
git_add("test.txt")
git_commit("Adding a file", author = "jerry <jerry@gmail.com>")
顶部推送到远程:
git_push(remote = "origin", repo = ".")
并使用这个简单的语法查看所有其他有用的函数。