2012-04-05 4 views
10

Questo può sembrare paradossale, so che i changeset segreti sono intesi per essere privati, ma cosa succede se voglio eseguire il backup di quei changeset segreti?Pushet changeset segreti

Io lavoro con alcuni rami in parallelo e talvolta voglio spingere uno, ma non gli altri. Per riuscirci, lavoro in cloni separati ma lo odio.

Quindi ora mercurial ha fasi, posso creare filiali segrete e avere tutto nello stesso repository. Il problema è che tra l'inizio del ramo segreto e la sua pubblicazione, voglio fare il backup di questi changeset segreti (ho un clone in un'altra macchina solo per tenere i miei backup nel caso in cui qualcosa accada con il mio repo locale o la mia macchina).

C'è un modo per farlo o il mio flusso di lavoro è completamente sbagliato?

risposta

2

Sembra che le fasi siano ancora relativamente nuove e alcuni flussi di lavoro, come questo, non sembrano ancora inclusi. A partire dal 2013-03-19, credo che l'unico modo per farlo sia quello di cambiare manualmente le fasi da segreto a pubblico.

È possibile utilizzare questi comandi dalla riga di comando:

for /f "delims=" %a in ('hg log --template "{rev} " -r "secret()"') do @set secret=%a 
hg phase -d %secret% 
hg push -f 
hg phase -sf %secret% 

Questo non cambia i commit al segreto sul repository si sta spingendo a, ho provato a cambiare la spinta per fare questo (ma era senza successo):

hg push -f --remotecmd hg phase -sf %secret% 

i commit avrebbero dovuto corrispondere esattamente per la remote hg command al lavoro, ma non ho potuto ottenere per cambiare sul repository remoto in ogni caso.

========================================= ==============

Se si desidera utilizzare una GUI come TortoiseHG Workbench, è necessario eseguire tutto manualmente (modificare le fasi nella GUI dei repository desiderati) al momento. Scusa, e spero che possiamo trovare una soluzione migliore, presto!

+1

Il flag '--remotecmd' non è pensato per eseguire' hg phase' sul lato server. Ha lo scopo di dire al tuo Mercurial locale come dovrebbe avviare il server Mercurial sul lato server quando si connette con SSH. –

4

Non è necessario contrassegnare nulla di segreto. Se si desidera utilizzare solo un ramo, utilizzare:

hg push -r REV 

Questo spingerà solo REV e i suoi antenati.

Il segreto è valido per le revisioni della coda di patch Mercurial, poiché non possono essere comunque trasferite e impedisce a un clone locale di copiarle.

Il tiraggio è utile per tracciare le modifiche non urgenti. Se si vuole ancora farne un backup, spingendoli li capovolgere al pubblico, ma è possibile ripristinare indietro di redigere (rispetto a un altro repository) con:

hg phase -fd 'outgoing(URL)' 

(URL può essere vuoto per la spinta di default pronti contro termine).

+2

Il valore dei rami di contrassegno come segreti è che protegge da incidenti (come omettere il -r REV per errore). –

+0

Certo, ma se vuole sostenerli, non possono essere segreti. –

+2

Sì, è un peccato non poter forzare un ramo segreto. –

-1

La cosa più semplice da fare ora-giorni è contrassegnare il repository di backup come non-publishing aggiungendo quanto segue al proprio file di configurazione hgrc.

[phases] 
publish = False 

Vedere Mercurial's Wiki per ulteriori informazioni.

+1

Questa è solo la metà della risposta. Il primo problema è come far uscire i changeset segreti ... – schlamar

1

L'approccio migliore è una combinazione di @ mischab1's answer, @ mark-tolonen's answer e alias.

Seguendo la risposta di mischab1, ci si assicura che premendo sulla posizione di backup non si cambi la fase in "pubblico".

secondo passo sarebbe quello di aggiungere la posizione di backup del repository hgrc/percorsi:

[paths] 
default = ... 
backup = backup_location 

Il passo successivo è quello di definire un comando di backup tramite alias nel hgrc globale, per esempio "bubr" (per il ramo corrente di backup) o "burev" (backup corrente di backup).

[alias] 
bubr = push -b . backup 
burev = push -r . backup 

hg bubr o hg burev sarà quindi spingere l'attuale ramo/revisione nella posizione definita come percorso di "backup".

Modifica Questo ha ancora l'inconveniente che si potrebbe spingere per sbaglio tutte le modifiche con "hg push" in modo da definire anche un comando hg pubr per spingere il ramo corrente e che non utilizzano "hg push" per impostazione predefinita potrebbe essere utile.

+0

Probabilmente potresti impostare il tuo "default" per puntare al backup, e dare al tuo vero server HG un nome diverso, come "reale". Quindi "hg push" semplicemente spingerà al backup, e puoi definire un altro alias come "hg real-push" per essere "push -r. Reale". In questo modo non invierai mai nulla al reale per sbaglio. – DenNukem

0

Questo è il migliore che ho trovato finora. Penso che sia essenzialmente equivalente a ciò che vuoi spingere/tirare per essere in grado di fare.

  1. Selezionare tutti i gruppi di modifiche segreti si desidera trasferire come bozza
  2. Nella corsa fonte repo hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
  3. Nella corsa destinazione repo hg unbundle bundlefile.hg
  4. I gruppi di modifiche entreranno in backup come bozza
  5. Segna la prima bozza di changeset come segreta, e tutti i suoi discendenti saranno contrassegnati in tal modo

Non sono riuscito a far funzionare # 2 se i changeset erano ancora contrassegnati come segreti.

0
@echo off 
rem hgfullpull_naive.cmd 
setlocal 
set SRC_REPO=%~f1 
set DST_REPO=%~f2 
set TMP_DIR=%TEMP%\%~n0.tmp 
set NODES_LIST=%TMP_DIR%\%~n0.%RANDOM%.tmp 

if "%SRC_REPO%"=="" exit /b 1 
if "%DST_REPO%"=="" exit /b 1 
if "%SRC_REPO%"=="%DST_REPO%" exit /b 1 

call :ALL 
del /Q "%NODES_LIST%" 
endlocal 
goto :eof 

:ALL 
    md "%TMP_DIR%" 
    hg log --rev "secret()" --template "{node}\n" --repository "%SRC_REPO%" >"%NODES_LIST%" || exit /b 1 
    call :CHANGE_PHASE "%SRC_REPO%" --draft 
    hg pull --repository "%DST_REPO%" "%SRC_REPO%" 
    call :CHANGE_PHASE "%SRC_REPO%" --secret 
    call :CHANGE_PHASE "%DST_REPO%" --secret 
    goto :eof 

:CHANGE_PHASE 
    setlocal 
    set REPO=%~1 
    set PHASE=%~2 
    for /F "eol=; delims= usebackq" %%i IN ("%NODES_LIST%") DO (hg phase %PHASE% --force --rev %%i --repository "%REPO%") 
    endlocal 
    goto :eof