2010-07-28 8 views
5

Ho un repository Git originariamente importato da Subversion. Alcune parti delle informazioni dell'autore/committer sono errate, il che non è colpa di Git, ma principalmente a causa di un errore di commit con Subversion.Utilizzare git filter-branch per riscrivere autori/committer e inviare messaggi simultaneamente

Vorrei utilizzare git filter-branch per riscrivere la cronologia del repository, correggendo le informazioni del committer e dell'autore.

Il problema è ... Ho bisogno di ingannare le informazioni dell'autore dal commit messaggi. Per quanto ne so, git filter-branch consente di filtrare e modificare le informazioni dell'autore (con --env-filter) e/o di filtrare i messaggi di commit (con --msg-filter), ma non per fare entrambe le cose contemporaneamente, con le informazioni condivise tra i diversi filtri .

Quindi sono un po 'perplesso su come farlo ... il meglio che posso pensare è farlo in più passaggi: prima raccogli tutti i messaggi di commit, poi fai uno script per passare e filtrare tutte le informazioni sull'autore/committer. Questo sembra abbastanza inelegante e soggetto a errori, quindi mi chiedo se qualcun altro ha capito di fare questo tipo di lavoro più agevolmente.

risposta

4

L'unica cosa che posso pensare di fare in un passaggio è usare un filtro di commit. Come il filtro dei messaggi, prende il messaggio di log su stdin, così sarai in grado di analizzarlo e scoprire cosa è necessario. È quindi possibile impostare autonomamente le variabili appropriate e chiamare direttamente il numero git commit-tree. (Il filtro commettere è essenzialmente un rimpiazzo per il commit-albero, prendendo gli stessi argomenti e produrre la stessa uscita.)

In bash, sarebbe qualcosa di simile:

message=$(read_from_stdin) 

modify_env_vars "$message" 

echo "$message" | git commit-tree "[email protected]" 

I Non ho mai provato questo, ma non riesco a capire perché non funzionerebbe, assumendo che tu abbia scritto correttamente queste due funzioni di shell!

(E solo una piccola nota - non è tanto che --env-filter e --msg-filter non possono influenzarsi a vicenda, è che sono sempre eseguiti in questo ordine. Quindi, il primo filtro potrebbe lasciare gli effetti collaterali nei file o l'ambiente per l'altro da vedere, ma sono in un ordine che ti impedisce di fare quello che vuoi.)

+0

Grazie, Jefromi, darò uno scatto! Inoltre, buon punto sull'ordinazione di --env-filter e --msg-filter: avevo pensato di lasciare i file temporanei come suggerito, ma ho capito che non avrebbe funzionato nell'ordine che volevo. –

Problemi correlati