2012-12-21 8 views
14

Git Repo, gibt es einen Ordner ABC mit drei Dateien, alle mit Leerzeichen im Namen file - 1.ext, file - 2.ext und file - 3.ext. Ich möchte den Ordner und die Dateien entfernen. Ich bin nur bewusst, wie die DateienEntfernen Sie ein Verzeichnis von allen vorherigen Commits

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

dann Sie git push origin master --force über diesen Befehl zu entfernen.

(1) Aber wie entfernen Sie den Ordner ABC und seine Dateien von allen vorherigen Commits?

Auch die Dateien haben Leerzeichen im Namen und Folgendes wird sie nicht im Repo Nachweis verpflichtet:

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

(2), was sollte die Syntax, um die Dateien mit Leerzeichen in dem Namen zu entfernen sein ? Hinweise

  • OSX
  • Github
+2

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. –

+12

@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. –

Antwort

20

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
11

Statt --index-filter zu verwenden, versuchen Sie, mit --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!). 

Die Kommandozeile:

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