2011-08-25 12 views
29

Quando ho avviato il mio repository git, ho eseguito il commit di alcuni file come commit iniziale. Ora, dopo molti commit, ho notato che ho incluso in quei file una riga con informazioni che non voglio pubblicare (a differenza del resto del codice). Quindi voglio rimuovere/modificare questa riga e conservare il resto del codice.git: modifica di una riga nel file per la cronologia completa

Cercando in giro ho trovato questa soluzione: inserire un vuoto commit come iniziale commit (descritto qui: Insert a commit before the root commit in Git?), fare un rebase su di esso e quindi modificare il vecchio primo commit via modificare. Sfortunatamente, durante il rebase si verificano molti crudeli conflitti di fusione (come descritto qui: git: solving conflicts caused by rebase).

C'è un modo diverso per risolvere il mio problema o devo rebase e modificare tutti i conflitti a mano?

Grazie in anticipo :)

Tibo

+0

Se sono solo cambiando una sola riga, i conflitti di unione dovrebbe essere piuttosto piccola. – Clueless

+0

possibile duplicato di [Come rimuovere file sensibili dalla cronologia di git] (http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history) –

+0

@Clueless: i conflitti sorgono durante la ridefinizione, questi sono i conflitti che ho risolto in passato – tbolender

risposta

38

Ecco un comando che rimuoverà una riga incriminata dalla cronologia di un file in tutti i rami:

git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all 

Controlla tutte le revisioni, esegue il comando sed su di esso, quindi ripristina la revisione.

Il comando sed in questo caso corrisponde a qualsiasi riga contenente il motivo sensitive information nel file denominato filename ed elimina tali righe.

Nota: è consigliabile disporre di un backup e provare lo script sed per assicurarsi che stia facendo ciò che si desidera, poiché potrebbe richiedere un po 'di tempo per essere eseguito su una lunga storia.

+0

C'è qualche possibilità di ignorare un errore sed (ad es. Quando un file non esiste in una revisione)? – tbolender

+3

Non so se l'opzione '-q' lo fa o no. Potrebbe essere necessario avvolgerlo in una shell se-allora, come 'if [-e file]; poi sed ...; fi' –

+0

Usare la shell se ha funzionato per me :) – tbolender

4

ho fatto questo comando che non da errori quando un file non esiste:

filename=./path/to/your/filename 
filter=your_regex_here 

git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo “skipping file“' -- --all 
Problemi correlati