2013-09-06 3 views
15

Я однажды спросил очень similar question и получил ответ, который работал из командной строки, но теперь я хочу использовать R для автоматизации процесса из Windows (Linux намного проще).Используйте R, чтобы надавить локальное репо на github на Windows

Вот что я пытаюсь сделать:

  1. Создать локальный каталог (или он уже существует)
  2. Создание нового GitHub репо в облаке одним и тем же именем, как и местные (based on this answer)
  3. Добавить .git в местное репо
  4. сделать первоначальные фиксации
  5. Установить связь между облаком репо и местного репо
  6. Нажмите фиксации и файлы в локальном репо на GitHub

Я считаю based on the output, что я получаю все пути к шагу 5, прежде чем я не (как фиксацию и файлы из локального каталога никогда не идти на GitHub в облако). Я знаю, что шаг 2 работает, потому что создано пустое репо here. Я не знаю, как протестировать шаг 5. На последнем этапе shell(cmd6, intern = T) RGui и RStudio приводят к вечной спирали смерти. Вопрос: Как я могу нажать фиксацию и локальное репо на облако.

Вот мой обновленный код (единственное, что является пользователем специфичный имя пользователя и пароль в третий код фрагмента):

## Create Directory 
repo <- "foo5" 
dir.create(repo) 
project.dir <- file.path(getwd(), repo) 

## Throw a READ.ME in the directory 
cat("This is a test", file=file.path(project.dir, "READ.ME")) 

## Github info (this will change per user) 
password <-"pass" 
github.user <- "trinker" 

## Get git location 
test <- c(file.exists("C:/Program Files (x86)/Git/bin/git.exe"), 
    file.exists("C:/Program Files/Git/bin/git.exe")) 
gitpath <- c("C:/Program Files (x86)/Git/bin/git.exe", 
    "C:/Program Files/Git/bin/git.exe")[test][1] 

## download curl and set up github api 
wincurl <- "http://curl.askapache.com/download/curl-7.32.0-win64-ssl-sspi.zip" 
url <- wincurl 
tmp <- tempfile(fileext = ".zip") 
download.file(url,tmp) 
unzip(tmp, exdir = tempdir())  
shell(paste0(tempdir(), "/curl http://curl.haxx.se/ca/cacert.pem -o " , 
    tempdir() , "/curl-ca-bundle.crt")) 
json <- paste0(" { \"name\":\"" , repo , "\" } ") #string we desire formatting 
json <- shQuote(json , type = "cmd") 
cmd1 <- paste0(tempdir() ,"/curl -i -u \"" , github.user , ":" , password , 
    "\" https://api.github.com/user/repos -d " , json) 

shell(cmd1, intern = T) 

## Change working directory 
wd <- getwd() 
setwd(project.dir) 

## set up the .git directory 
cmd2 <- paste0(shQuote(gitpath), " init") 
shell(cmd2, intern = T) 

## add all the contents of the directory for tracking 
cmd3 <- paste0(shQuote(gitpath), " add .") 
shell(cmd3, intern = T)  

cmdStat <- paste0(shQuote(gitpath), " status") 
shell(cmdStat, intern = T) 

## Set email (may not be needed) 
Trim <- function (x) gsub("^\\s+|\\s+$", "", x) #remove trailing/leading white 

x <- file.path(path.expand("~"), ".gitconfig") 
if (file.exists(x)) { 
    y <- readLines(x) 
    email <- Trim(unlist(strsplit(y[grepl("email = ", y)], "email ="))[2]) 
} else { 
    z <- file.path(Sys.getenv("HOME"), ".gitconfig") 
    if (file.exists(z)) { 
     email <- Trim(unlist(strsplit(y[grepl("email = ", y)], "email ="))[2]) 
    } else { 
     warning(paste("Set `email` in", x)) 
    } 
} 
cmdEM <- paste0(shQuote(gitpath), sprintf(" config --global user.email %s", email))   
system(cmdEM, intern = T) 

## Initial commit 
cmd4 <- paste0(shQuote(gitpath), ' commit -m "Initial commit"') 
system(cmd4, intern = T) 

## establish connection between local and remote 
cmd5 <- paste0(shQuote(gitpath), " remote add origin https://github.com/", 
    github.user, "/", repo, ".git") 
shell(cmd5, intern = T) 

## push local to remote 
cmd6 <- paste0(shQuote(gitpath), " push -u origin master") 
shell(cmd6, intern = T) 

setwd(wd) 

Я знаю, что сценарий немного больше времени, но это все необходимо воссоздать проблему и воспроизвести проблему:

Примечание Я обновил вопрос в ответ Саймона, когда он был прав и приблизился к толчке. Содержание исходного вопроса можно найти here.

+0

Репо выглядит нормально? Может быть проблема с Windows блокировки файлов и не отпускать. Также попробуйте изменить 'cmd3' на' paste0 (shQuote (gitpath), "add -all") ', а затем также запускать' paste0 (shQuote (gitpath), "status") 'сразу после этого. ** И ** вы можете поместить переключатель для определения платформы, и если в Windows использовать 'shell' не' system'. Я считаю, что 'shell' будет немного более дружелюбным в' Windows'. –

+0

По моему опыту, вы почти всегда лучше используете 'system', а не' shell'. – hadley

ответ

8

Если используется протокол HTTPS адрес, то убедитесь, что:

  • переменной окружения %HOME% определяется
  • _netrc файл существует в нем с правом верительных толкать обратно в репозиторий

Этот файл содержит Шоудом:

machine github.com 
login username 
password xxxx 
protocol https 

Это работает, даже если у вас есть activated the recent two-factor authentication on GitHub.

Тогда ваш толчок не будет тайм-аут:

cmd6 <- paste0(shQuote(gitpath), " push -u origin master") 
shell(cmd6, intern = T) 

Это проще, чем setting public/private ssh keys.


Как OP Tyler Rinkercommented, установка %HOME% иллюстрируется на мой другой ответ "Git - How to use .netrc file on windows to save user and password".
Это обычно делается git-cmd.bat:

if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH% 
@if not exist "%HOME%" @set HOME=%USERPROFILE% 

Но вы можете сделать это вручную.

+0

Я не самый опытный компьютер. Не могли бы вы немного рассказать о том, что означает: «переменная среды% HOME% определена» означает? Означает ли это: 'Sys.getenv() [" HOME "]'? –

+0

Я вижу этот связанный пост: http://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on-windows-to-save-user-and-password –

+0

Это действительно работает. –

2

Проблема, по-видимому, заключается в смешении ssh и https протоколов.

Обратите внимание на URL-адреса должны быть:

# https: 
"https://github.com/<username>/<myrepo>.git" 

# ssh: 
"[email protected]:<username>/<repo>.git" 

У вас есть:

cmd5 <- paste0(shQuote(gitpath), " remote add origin https://github.com:", 
github.user, "/", repo, ".git") 
cat(cmd5) 
"... remote add origin https://github.com:trinker/foo2.git" 

Просто измените cmd5 на

# Note the forward slash at EOL in place of the colon 
cmd5 <- paste0(shQuote(gitpath), " remote add origin https://github.com/", 
github.user, "/", repo, ".git") 
"... remote add origin https://github.com/trinker/foo2.git" 

Он также не может повредить, чтобы запустить это сразу после того, как git add . :

cmdStat <- paste0(shQuote(gitpath), " status") 
shell(cmdStat, intern = T) 
+0

Саймон вы правы. Это заставляет меня пройти мимо следующего препятствия. Последним шагом является «push -u origin master». Это приводит к смерти спирали от RGui и RStudio. Я вижу, что вы создали foo repo на github, но он исчез. Вы получили толчок к работе? Если да, то какая идея о том, что я делаю неправильно? У меня нет сообщения об ошибке, так как это смертельная спираль. Я обновил код/​​вопрос выше, чтобы показать, что я сделал. –

+0

@TylerRinker hmm. У меня тоже смертельная спираль. Я думаю, что «git» - это просто время. Это, наверное, что-то довольно очевидное, мы просто его не замечаем! Я поплю свой мыслящий колпачок после работы (кто думает на работе) :-) –

+0

Спасибо большое. –

Смежные вопросы