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
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. –
@WouterJ A volte è possibile rimuovere i file inutili e di grandi dimensioni dalla cronologia del repository o rimuovere i file con informazioni riservate. –