Как я могу зафиксировать изменения в GitHub из скрипта R? - PullRequest
4 голосов
/ 30 марта 2019

Я пытаюсь автоматизировать некоторые основные операции с git из скрипта R.Я использую Rstudio на ОС Windows.Это может быть полезно, например, если вы хотите обновить GitHub, когда скрипт завершит выполнение какой-либо автоматизированной задачи.

Я написал несколько простых функций, которые используют функцию R shell() и оператор канала & Window для отправки цепочки команд на терминал ОС:

# 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)
}

My gitstatus, gitadd и gitpush функции работают.Функция gitcommit не работает.Он генерирует следующую ошибку:

неустранимый: пути с -a не имеет смысла.
Предупреждающее сообщение:
В оболочке (cmd): 'd: & cd D: / Documents/ R / my_path & git commit -am 'commit from Rstudio' 'выполнение завершилось неудачно с кодом ошибки 128

Функция gitpush работает, потому что если вы переключаетесь на терминал или git в Rstudio, вы можетепередайте изменения и затем успешно позвоните gitpush.

Есть идеи, как решить эту проблему?

...

Примечание: У меня установлен Git bash, и я могу успешно использовать gitиз командного терминала Windows и Rstudio.Я также попробовал альтернативную стратегию, которая заключалась в том, чтобы R записал временный файл .bat, а затем выполнил его, но эта стратегия также зависает на этапе фиксации.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Решение

Ответ лежит в пределах Дирка Эддельбюттеля drat функция пакета addrepo .Также было необходимо использовать функцию git2r config, чтобы гарантировать, что git распознает функции R. git2r, вероятно, обеспечит более надежное решение для работы с git из сценария R в будущем.А пока вот как я исправил проблему.

  • Установите git2r.Используйте git2r :: config (), чтобы гарантировать, что git распознает R.

  • Из кода Дирка я изменил функцию 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()

Ну, картинка выглядит шатко, но я думаюВы получаете точку.

0 голосов
/ 30 марта 2019

Из того, что я прочитал в этом вопросе Ubuntu , вы должны использовать &&, а не &, для разделения нескольких команд в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...