2013-09-06 24 views
15

Kiedyś zapytałem bardzo similar question i otrzymałem odpowiedź, która działała z linii poleceń, ale teraz chcę użyć R do zautomatyzowania procesu z systemu Windows (Linux jest znacznie łatwiejszy).Użyj R, aby uruchomić lokalne repo na github na Windows

Oto, co usiłuję zrobić:

  1. Utwórz katalog lokalny (lub już istnieje)
  2. wygenerować nowy GitHub repo w chmurze o nazwie takiej samej jak miejscowy (based on this answer)
  3. Dodaj .git do lokalnego repo
  4. dokonać wstępnej popełnić
  5. nawiązać połączenie między chmurą lokalnego repo i repo
  6. Pchnąć popełnić i pliki w lokalnym repo do GitHub

wierzę based on the output że dostanę całą drogę do kroku 5, zanim nie (jak popełnić i pliki z katalogu lokalnego nigdy iść do github w Chmura). Wiem, że krok 2 działa, ponieważ puste repo jest tworzone here. Nie wiem, jak przetestować krok 5. W ostatnim kroku RGui i RStudio prowadzą do spirali śmierci wiecznej. Pytanie brzmi: Jak mogę przekazać zatwierdzenie i lokalne ponowne otwarcie do chmury.

Tu jest mój zaktualizowany kod (jedyną rzeczą, która jest specyficzna użytkownika jest nazwa użytkownika i hasło w trzecim kodu fragmencie):

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

wiem, że skrypt jest nieco dłużej, ale to wszystko konieczny do odtworzenia problemu i powtórzenia problemu:

UwagaUaktualniłem pytanie w świetle odpowiedzi Simona, ponieważ był poprawny i zbliżył się do poparcia. Treść pierwotnego pytania można znaleźć pod adresem here.

+0

Czy transakcja repo wygląda poprawnie? Może to być problem z blokowaniem plików systemu Windows i nie pozwalaniem na odejście. Być może spróbuj zmienić 'cmd3' na' paste0 (shQuote (gitpath), "add -all") ', a następnie uruchom' paste0 (shQuote (gitpath), "status") 'zaraz potem. ** AND ** możesz chcieć umieścić przełącznik, aby określić platformę i jeśli w systemie Windows użyjesz 'powłoki', a nie' systemu'. Uważam, że 'shell' jest nieco bardziej przyjazny w' Windows'. –

+0

Z mojego doświadczenia wynika, że ​​prawie zawsze lepiej jest używać 'system', a nie' powłoki'. – hadley

Odpowiedz

8

Jeśli używasz https adres, a następnie upewnij się, że:

  • zmienna środowiskowa %HOME% definiuje
  • plik _netrc istnieje w nim z prawej poświadczeń odepchnąć do repo

Ten plik Shoud zawiera:

machine github.com 
login username 
password xxxx 
protocol https 

Działa to nawet jeśli masz activated the recent two-factor authentication on GitHub.

Wtedy twój pchnięcie nie zostanie zakończony:

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

Jest to łatwiejsze niż setting public/private ssh keys.


Jako OP Tyler Rinkercommented ustawienie %HOME% jest zilustrowany w drugiej moją odpowiedź "Git - How to use .netrc file on windows to save user and password".
ta jest zwykle wykonywana przez git-cmd.bat:

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

Ale można to zrobić ręcznie.

+0

Nie jestem najbardziej doświadczonym komputerem. Czy mógłbyś nieco rozwinąć: "zmienna środowiskowa% HOME%" jest zdefiniowana? Czy to znaczy: 'Sys.getenv() [" HOME "]'? –

+0

Widzę ten powiązany wpis: http://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on-windows-to-save-user-and-password –

+0

To rzeczywiście działa. –

2

Problem po prostu wydaje się mieszać protokoły ssh i https.

Uwaga adresy URL powinny być:

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

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

Masz:

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" 

Wystarczy zmienić cmd5 do

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

To również nie zaszkodzi, aby uruchomić ten natychmiast po git add . :

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

Simon, masz rację. To doprowadza mnie do kolejnej przeszkody. Ostatnim krokiem jest 'master pochodzenia push -u'. Powoduje to spiralę śmierci od RGui i RStudio. Widzę, że stworzyłeś repo na githubie, ale już go nie ma. Czy masz siłę do pracy? Jeśli tak, masz pomysł na to, czego nie robię poprawnie? Nie mam komunikatu o błędzie, ponieważ jest to spirala śmierci. Zaktualizowałem kod/pytanie powyżej, aby pokazać, co zrobiłem. –

+0

@ TylerRinker hmm. Mam też spiralę śmierci. Myślę, że 'git' to tylko wyczekiwanie. To chyba coś dość oczywistego, po prostu tęsknimy za tym! Po pracy zadzwonię do mojej głowy (kto myśli w pracy) :-) –

+0

Dziękuję bardzo docenione. –

Powiązane problemy