2012-12-21 17 views
14

Git Repo, c'è una cartella ABC con tre file, tutti con spazi nel nome file - 1.ext, file - 2.ext e file - 3.ext. Voglio rimuovere la cartella e i file. Sono consapevole solo di come rimuovere i file tramite questo comandoRimuovere una directory da tutti i precedenti commit

git filter-branch --index-filter 'git rm --cached --ignore-unmatch FILE' \--prune-empty --tag-name-filter cat -- --all

allora si git push origin master --force.

(1) Ma come si rimuove la cartella ABC ei relativi file da tutti i precedenti commit?

Inoltre, i file hanno spazi nel nome e la successiva non li rileva nella repo commette:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file\ -\ 1.ext' \--prune-empty --tag-name-filter cat -- --all 

(2) che cosa dovrebbe essere la sintassi per rimuovere i file con gli spazi nei nomi ? Note

  • OSX
  • github
+2

Perché vuoi loro di eliminare da tutti i commit? I commit sono istantanee del tuo progetto. Quando vuoi eliminare alcuni file o dir, devi creare un nuovo commit che li cancelli dal tuo progetto. –

+12

@WouterJ A volte è possibile rimuovere i file inutili e di grandi dimensioni dalla cronologia del repository o rimuovere i file con informazioni riservate. –

risposta

20

Dire si inizia con una storia di

$ git lola --name-status 
* e709131 (HEAD, master) bar 
| A  bar 
* 61493ac ABC/file - 3.ext 
| A  ABC/file - 3.ext 
* 34cce9e ABC/file - 2.ext 
| A  ABC/file - 2.ext 
* 115e6d5 ABC/file - 1.ext 
| A  ABC/file - 1.ext 
* 5ea5b42 foo 
    A  foo

Nota: git lola è un alias di non-standard, ma molto utile.

git rm supporta un'opzione per la rimozione di sottoalberi.

-r
consentire la rimozione ricorsiva quando viene dato un nome di directory principale.

Dopo aver eseguito

$ git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch ABC' \ 
    --prune-empty --tag-name-filter cat -- --all

vedrete un output analogo

Rewrite 115e6d5cd06565ca08f1e5c98c4b91246cf59fa1 (2/5)rm 'ABC/file - 1.ext' 
Rewrite 34cce9e90f832460137e620ebacc8a73a99e64ce (3/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
Rewrite 61493ac3211808f34f616dbc33d51d193b3f45a3 (4/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
rm 'ABC/file - 3.ext' 
Rewrite e709131f1fe6103adf37616c9fa500994aeb30d0 (5/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
rm 'ABC/file - 3.ext' 

Ref 'refs/heads/master' was rewritten

Se si è soddisfatti del risultato, eliminare il vecchio maestro con

$ git update-ref -d refs/original/refs/heads/master

e ora hai una cronologia di

Per rispondere alla seconda domanda, è necessario dire che si desidera eliminare solo ABC/file - 2.ext. Ricorda che avrai bisogno di due livelli di quoting: un layer per l'intero comando e un altro per uscire dagli spazi in un argomento a quel comando, il nome del file da rimuovere.

Un modo per farlo è

$ git filter-branch --index-filter \ 
    'git rm --cached --ignore-unmatch "ABC/file - 2.ext"' --prune-empty \ 
    --tag-name-filter cat -- --all

Nota i doppi apici all'interno delle singole citazioni.

Se tu avessi eseguire questo comando, invece, la vostra storia sarebbe diventata

$ git lola 
* a8d1b0d (HEAD, master) bar 
* cff0c4e ABC/file - 3.ext 
* 115e6d5 ABC/file - 1.ext 
* 5ea5b42 foo
11

Invece di usare --index-filter, provate con --tree-filter:

--tree-filter <command> 
    This is the filter for rewriting the tree and its contents. The argument is 
    evaluated in shell with the working directory set to the root of the 
    checked out tree. The new tree is then used as-is 
    (new files are auto-added, disappeared files are auto-removed - 
    neither .gitignore files nor any other ignore rules HAVE ANY EFFECT!). 

La linea di comando:

git filter-branch --tree-filter 'rm -rf path/to/ABC' \ 
    --prune-empty --tag-name-filter cat -- --all 
Problemi correlati