2012-12-23 18 views
11

Ho fatto un errore e un file su un progetto in un repository git contiene una password. Non è un problema perché non è un repository pubblico, ma mi piacerebbe sbarazzarmi di quella password nel repository.modifica un file in tutti i commit in git

La cronologia del repository è molto semplice in quanto sono l'unico sviluppatore quindi ha solo 12 commit e uno dei commit è taggato.

La modifica in questo caso non influirà su nulla nella cronologia (il diff rimarrà lo stesso) poiché la password che voglio cancellare è presente solo dal primo commit. Vorrei rimuovere quella stringa come se non fosse stata lì in qualsiasi momento.

C'è qualche tipo di comando per fare questo o devo rigenerare la cronologia solo dall'inizio con un nuovo punto di partenza senza la password e applicando i diff in cima a quello?

+1

ho segnalato questo come duplicato di http://stackoverflow.com/questions/1186535/how-to- modify-a-specified-commit dove hai la tua risposta. – zmo

+0

@zmo: il link che hai fornito non ha nulla a che fare con questa domanda.potrebbe benissimo essere un duplicato di qualcosa, ma non di questo – mvp

risposta

6

Vedere https://help.github.com/articles/remove-sensitive-data. il file sarà presente in tutti i commit, se non lo hai cancellato, poiché tutti i commit contengono lo stato dell'intero repository.

Fondamentalmente, è necessario eseguire un filtro-ramo su tutti i tuoi commit e quindi forzare il push in repo. Il comando è distruttivo e cambierà tutti i commit in cui il file è stato presente al repository, quindi fai attenzione.

+1

Espanderci sopra: stai cercando 'git filter-branch --tree-filter'. Passa uno script a quello che fa il cambiamento che vuoi, e git controllerà ogni commit, eseguirà il tuo script e ricrea il commit con le tue modifiche. – Chronial

2

Grazie che era esattamente il comando che stavo cercando e leggendo quell'articolo e la documentazione del filtro-ramo ho ottenuto la sintassi esatta che volevo facendo uso di sed per rimuovere la stringa dal file.

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all 

dove:

"password" -> è la stringa che deve essere rimosso

"./path_to_file/filename" -> è il percorso del file all'interno del pronti contro termine che ha bisogno di da modificare

runned nella root di repository ha fatto il trucco come un fascino.

Dopo aver apportato la modifica, è necessario inviarlo al server remoto. Questo deve essere forzato in modo che il server accetti i nuovi riferimenti e tag completamente riscritti.

Quindi una spinta forzata del pronti contro termine al server remoto (origine nella maggior parte dei casi)

git push origin --all --force 

E una spinta forzata di tag al server remoto

git push origin --tags --force 
+1

nota che devi anche a) forzare l'inserimento nel repository eb) pulire successivamente i cloni locali del repository. questo è il motivo per cui mi sono collegato a un articolo più lungo e non ho cercato di includere tutto qui. – eis

+0

sì, dopo il comando ho fatto una spinta forzata di entrambi i ref e tag. Ho intenzione di modificare questa risposta per completezza. Grazie. –

0

vorrei fare quanto segue :

git rebase --interactive 

Modifica il comando pick davanti al primo commit (il commit con la password) a edit e mantenere tutte le altre linee così come sono. Salva il file ed esci.

Poi rimuovere la password dal file (e fare tutte le modifiche desiderate), quindi:

git add name-of-file-with-password 
git commit --amend 
git rebase --continue 
Problemi correlati