2014-09-19 29 views
6

Ho bisogno di automatizzare un rebase interattivo o di sostituirlo con altri comandi. Lasciatemi solo spiegare la mia situazione attuale:git: Come automatizzare rebase interattivo/sostituirlo con comandi git equivalenti

In una transizione di tipo svn-> git è necessario rebase il repository git appena creato per correggere una "interruzione della cronologia" eseguita durante SVN. Ecco il mio flusso di lavoro manuale per risolvere il problema.

branchNEW: containing history from SOMEDAY until now 
branchOLD: containing history from past to SOMEDAY 

EDIT o come ascii:

branchNEW:  Y - Z 
branchOLD: W - X 

entrambi i rami non hanno commit comuni.

L'idea di base è ora di rebase ramoNEW su branchOLD. Sfortunatamente ci sono stati alcuni refactoring SOMEDAY: alcuni file sono stati spostati in un'altra directory. Il risultato del rebase ora è che ogni file spostato esiste in entrambe le posizioni.

EDIT

some file exist in X 
the (nearly) same files also exist in Y, just on another path 

branchNEW: W - X - Y - Z 
(after rebase) 

Dopo la rebase, HEAD ora contiene i file di X e Y. Ho anche cercato di aggiungere un nuovo impegnano a branchOLD che rimuove i file vecchi. Dopo il rebase SVN-HEAD e git-HEAD sono identici binari, ma il "git log --follow" non funziona.

Ora il problema principale: sono in grado di risolvere questo problema utilizzando un secondo, rebase interattivo:

git rebase -i SHA 

SHA è lo sha-id del vecchio radice commettere in branchNEW. Ora nell'editor devo cambiare "pick" in "edit" per il commit più in alto. Dopo essere usciti l'editor ora devo rimuovere i file sbagliati

git rm -f fileA fileB 
git commit --amend 
git rebase --continue 

Dopo questa testa di git è binario identico a capo di SVN e in aggiunta, git ha la storia completa e anche "git log --follow" opere per i file spostati.

Poiché questo passaggio è solo una piccola parte di un'enorme transizione VCS in futuro, è necessario eseguire lo script dell'intero processo. Ma come automatizzare i passaggi precedenti?

(so che SHAs non rimarrà lo stesso, ma sono in grado di ottenere lo SHA richiesta dal svn-id che è incorporato in ogni messaggio di commit)

+0

Non sono sicuro, ma forse 'git filter-branch' potrebbe aiutarti. – Jubobs

risposta

3

ho trovato una possibile soluzione:

git rebase --interactive invia la "lista di rebase commits" (l'elenco in cui è possibile selezionare, memorizzare, modificare, ...) un editor. Quale tipo di editor può essere configurato. Quindi la soluzione è configurare un "editor" alternativo solo per questo rebase interattivo.Questo può essere fatto utilizzando l'ambiente GIT_SEQUENCE_EDITOR variabile:

GIT_SEQUENCE_EDITOR="command" git rebase -i SHA 

comando potrebbe essere uno script di shell o solo un semplice sed:

GIT_SEQUENCE_EDITOR="sed -i 's/^pick ce5efdb /edit ce5efdb /;/^pick ce6efdb /d'" git rebase -i SHA 

Importante: la "lista dei rebase impegna" viene passato come file al comando . Quindi il comando deve accettare un nome di file come parametro e scrivere il risultato sullo stesso file. "sed -i" sta esattamente facendo questo.

+0

Ho bisogno di automatizzare lo schiacciamento di alcuni commit storici su un repository al fine di creare uno script che eseguirà tutte le operazioni necessarie per una migrazione da svn come prova del concetto che altri membri del progetto possono utilizzare in modo completamente riproducibile per verificare che la migrazione sia corretta. Questo è semplicemente perfetto. – Irfy

0

expect potrebbe aiutarti anche tu. Anche se questo non è esattamente quello che devi fare, dovresti essere in grado di utilizzare qualcosa di simile per automatizzare il tuo processo:

#!/usr/bin/env expect 
spawn git rebase -i HEAD~2 

# down, delete word, insert 's' (for squash), Escape, save and quit 
send "jdwis \033:wq\r" 

expect "# This is a" 

# down 4, delete 3 lines, save and quit 
send "4j3d:wq\r" 

interact