2016-03-02 7 views
7

In base a questo article, ho creato un piccolo script che dovrebbe rimuovere tutte le occorrenze di un file nell'intero repository git, tutti i rami, tag e commit. Lo script:rimuovere il file da tutta la cronologia git

#!/usr/bin/env node 
var child_process = require('child_process'); 
if (process.argv.length < 3){ 
    console.error('USAGE: git-forget path/to/file') 
    process.exit(1); 
} 
var path = process.argv[2]; 

var phase = 0; 
function printLog(error, stdout, stderr) { 
    if (error) { 
    console.error('ERROR' + error); 
    } 
    console.log(++phase); 
    console.log(stdout); 
} 

child_process.execSync('git filter-branch --force --index-filter \'git rm -f --cached --ignore-unmatch '+ path +'\' --prune-empty --tag-name-filter cat -- --all'); 
child_process.execSync('echo "' + path + '" >> .gitignore', printLog); 
child_process.execSync('git add .gitignore'); 
child_process.execSync('git commit -m "Add ' + path +' to .gitignore"',printLog) 
child_process.execSync('git push origin --force --all',printLog); 
child_process.execSync('git push origin --force --tags',printLog); 

Questo script lavorato su un paio di pronti contro termine (che sono privati) e su una specifica ha mantenuto l'iniziale impegnano a file che stavo cercando di rimuovere. Dopo lo script è stato eseguito ho fatto questo git log --all -- .npmrc e trovato il commit iniziale. Cosa mi manca?

+1

sidenote: checkout [BFG, un'alternativa più semplice e veloce a git-filter-branch] (http://rtyley.github.io/bfg-repo-cleaner) – laggingreflex

+0

provato bfg, funziona localmente ma non si aggiorna remoto – qballer

+0

@qballer, quindi forzare le modifiche al telecomando? – Chris

risposta

5

Penso che quello che è successo è che si è dimenticato di dire agli altri utenti di questo repo non unione loro modifiche alla nuova storia, ma piuttosto di rebase. Dal documento citato:

Dì ai tuoi collaboratori per rebase, non unire, i rami si creati fuori del vostro vecchio (corrotto) cronologia del repository. Un'unione di commit potrebbe reintrodurre una parte o tutta la cronologia contaminata che è stata appena sostituita da .

Provare di nuovo a eseguire lo stesso script e vedere che nessuno reintroduce la vecchia cronologia mediante la fusione delle sue modifiche locali nella nuova testa.

+0

mentre sembra che tu abbia ragione, non ho idea su come risolvere questo problema. – qballer

+0

modificato la mia risposta –

+0

Grazie, ha risolto le cose. – qballer