Sagen Sie bitte mit einer Geschichte von
$ 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
beginnen Hinweis: git lola ist ein Nicht-Standard, aber sehr nützlicher Alias.
git rm
unterstützt eine Option zum Entfernen von Teilbäumen.
-r
rekursive Entfernung ermöglichen, wenn ein führender Verzeichnisnamen gegeben.
Nach dem Ausführen
$ git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch ABC' \
--prune-empty --tag-name-filter cat -- --all
Sie Ausgabe sehen, die
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
ähnelt Wenn Sie mit dem Ergebnis zufrieden sind, löschen Sie die alten Meister mit
$ git update-ref -d refs/original/refs/heads/master
und jetzt Sie haben eine Geschichte von
Um Ihre zweite Frage zu beantworten, sagen Sie, dass Sie nur ABC/file - 2.ext
löschen möchten. Denken Sie daran, dass Sie zwei Quotierungsebenen benötigen: eine Ebene für den gesamten Befehl und eine weitere, um Leerzeichen in einem Argument für diesen Befehl zu erhalten, den Namen der zu entfernenden Datei.
Eine Möglichkeit, das zu tun ist
$ git filter-branch --index-filter \
'git rm --cached --ignore-unmatch "ABC/file - 2.ext"' --prune-empty \
--tag-name-filter cat -- --all
Beachten Sie die doppelten Anführungszeichen innerhalb der einfachen Anführungszeichen.
Wenn Sie diesen Befehl statt laufen hätte, wäre Ihre Geschichte geworden
$ git lola
* a8d1b0d (HEAD, master) bar
* cff0c4e ABC/file - 3.ext
* 115e6d5 ABC/file - 1.ext
* 5ea5b42 foo
Warum wollen Sie sie von allen Commits löschen? Commits sind Momentaufnahmen Ihres Projekts. Wenn Sie ein Verzeichnis oder Dateien löschen möchten, sollten Sie ein neues Commit erstellen, das sie aus Ihrem Projekt löscht. –
@WouterJ Manchmal möchten Sie möglicherweise nutzlose, große Dateien aus dem Verlauf des Repositorys entfernen oder möglicherweise Dateien mit vertraulichen Informationen entfernen. –