2013-09-06 10 views
15

Una volta ho chiesto un similar question e ricevuto una risposta che ha lavorato dalla linea di comando, ma ora sto volendo utilizzare R per automatizzare il processo da Windows (Linux è molto più facile).Usa R per spingere repo locale per GitHub su Windows

Ecco quello che sto cercando di fare:

  1. Creare una directory locale (o già esistente)
  2. generare una nuova repo github nel cloud con lo stesso nome come locali (based on this answer)
  3. Aggiungi un .git al repo locale
  4. Fai iniziale commettere
  5. stabilire un collegamento tra la nuvola pronti contro termine e pronti contro termine locale
  6. Spingere il commit ei file nel repository locale per GitHub

Credo based on the output che ho tutta la strada al punto 5, prima di fallire (come il commettono e file dalla directory locale non vanno mai a github nel nube). So che il passaggio 2 funziona perché viene creato il repository vuoto here. Non so come testare il passaggio 5. All'ultimo step shell(cmd6, intern = T) RGui e RStudio danno origine a una spirale di morte eterna. La domanda è: Come posso spingere il commit e il repo locale sul cloud.

Ecco il mio codice aggiornato (l'unica cosa che è specifico dell'utente è username e password nel terzo codice pezzo):

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

So che la sceneggiatura è un po 'più lungo ma è tutto necessario per ricreare il problema e replicare il problema:

Nota Ho aggiornato la domanda alla luce della risposta di Simon poiché era corretto e si avvicinava alla spinta. Il contenuto della domanda originale può essere trovato here.

+0

Il repository appare ok? Potrebbe essere un problema con Windows che blocca i file e non lasciar andare. Prova anche a cambiare 'cmd3' in' paste0 (shQuote (gitpath), "add -all") 'e poi anche a eseguire' paste0 (shQuote (gitpath), "status") 'subito dopo. ** E ** potresti voler mettere un interruttore per determinare la piattaforma e se su Windows usa 'shell' not' system'. Trovo 'shell' per essere un po 'più amichevole su' Windows'. –

+0

Secondo la mia esperienza, è quasi sempre meglio usare 'system' e non' shell'. – hadley

risposta

8

Se si utilizza l'indirizzo https, quindi assicurarsi che:

  • l'ambiente è definito variabile %HOME%
  • un file _netrc esiste in esso con le credenziali diritto di spingere di nuovo al vostro repo

Quel file contiene Shoud:

machine github.com 
login username 
password xxxx 
protocol https 

Funziona anche se si dispone di activated the recent two-factor authentication on GitHub.

Allora la vostra spinta non saranno sospese:

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

Questo è più facile che setting public/private ssh keys.


Come il OP Tyler Rinkercommented, impostando %HOME% è illustrato nella mia altra risposta "Git - How to use .netrc file on windows to save user and password".
questo è normalmente fatto da git-cmd.bat:

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

ma è possibile farlo manualmente.

+0

Non sono il più esperto di computer. Potresti espandere un po 'cosa: "la variabile d'ambiente% HOME% è definita" significa? Significa: 'Sys.getenv() [" HOME "]'? –

+0

Vedo questo post correlato: http://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on-windows-to-save-user-and-password –

+0

Che funziona davvero. –

2

Il problema sembra semplicemente confondere i protocolli ssh e https.

Nota gli URL dovrebbero essere:

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

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

Hai:

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" 

Basta cambiare cmd5 a

# 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" 

Inoltre non potrebbe danneggiare per eseguire questo subito dopo git add . :

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

Simon, hai ragione. Questo mi porta oltre il prossimo ostacolo. L'ultimo passo è il 'push -u origine master'. Ciò si traduce in una spirale mortale da RGui e da RStudio. Vedo che hai creato un repository foo su Github ma non c'è più. Hai avuto la spinta per lavorare? Se è così, qualche idea su cosa non sto facendo correttamente? Non ho alcun messaggio di errore dato che è una spirale della morte. Ho aggiornato il codice/domanda sopra per mostrare cosa ho fatto. –

+0

@TylerRinker hmm. Anch'io ho una spirale mortale. Sto pensando che 'git' sta per scadere. Probabilmente è qualcosa di abbastanza ovvio, ci manca proprio! Farò il mio tappo di pensiero dopo il lavoro (chi pensa al lavoro) :-) –

+0

Grazie molto apprezzato. –

Problemi correlati