Git löscht Verlaufsdateien dauerhaft (enthält Verlauf)

Manchmal laden Sie versehentlich einige vertrauliche Dateien (z. B. Passwörter) oder Dateien hoch, die Sie nicht hochladen möchten (nicht rechtzeitig oder vergessen, sie zu .gitignore hinzuzufügen), und wenn die hochgeladenen Dateien besonders groß sind, führt dies dazu, dass andere dies tun Wenn
Sie den Code oder das ZIP-Paket herunterladen, müssen diese nutzlosen Dateien ebenfalls aktualisiert oder heruntergeladen werden.
Daher benötigen wir eine Methode zum dauerhaften Löschen dieser Dateien (einschließlich des Dateiverlaufs).

1 Suchen Sie den Dateinamen

Wenn der Dateiname bekannt ist, überspringen Sie diesen Schritt.


# 查找最大的5个文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

2 Dateien aus dem Repository löschen


git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all

Unter diesen ist path-to-your-remove-file der relative Pfad der Datei, die Sie löschen möchten (relativ zum Stammverzeichnis des Git-Warehouses). Ersetzen Sie ihn einfach durch die Datei, die Sie löschen möchten. Beachten Sie, dass die Datei oder Ordner hier, keiner muss mit „/“ beginnen, andernfalls wird davon ausgegangen, dass die Datei oder der Ordner im Git-Installationsverzeichnis beginnt.

Wenn das Ziel, das Sie löschen möchten, keine Datei, sondern ein Ordner ist, verwenden Sie bitte git rm --cached' 命令后面添加 -r 命令,表示递归的删除(子)文件夹和文件夹下的文件,类似于 den Befehl rm -rf.

Wenn Sie außerdem viele Dateien löschen möchten, können Sie diese in eine .sh-Datei schreiben und stapelweise ausführen. Wenn die Dateien oder Pfade chinesische Zeichen enthalten, ist das Festlegen chinesischer Pfade für MinGW oder CygWin mühsam. Sie können Platzhaltersymbole verwenden, zum Beispiel: sound/ music_ .mp3, sodass alle MP3-Dateien, die mit music_ beginnen, im Soundverzeichnis gelöscht werden.

Erstellen Sie beispielsweise eine neue Bash-Skriptdatei, del-music-mp3.sh:

#!/bin/bash
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch projects/Moon.mp3' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sound/Music_*.mp3' --prune-empty --tag-name-filter cat -- --all

Wenn Sie etwa Folgendes sehen, war der Löschvorgang erfolgreich:

Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
# Ref 'refs/heads/master' was rewritten

Wenn xxxxx unverändert angezeigt wird, bedeutet dies, dass die Datei nicht im Repo gefunden wurde. Bitte überprüfen Sie, ob Pfad und Dateiname korrekt sind.

Hinweis: Noch etwas: Wenn Sie diese Datei oder diesen Ordner in Zukunft nicht mehr hochladen möchten, fügen Sie diese Datei oder diesen Ordner bitte zur .gitignore-Datei hinzu und übertragen Sie dann Ihr Repo.

3 Pushen Sie unser modifiziertes Repo


## 以强制覆盖的方式推送你的repo, 命令如下:
git push origin master --force --all

## 这个过程其实是重新上传我们的repo, 比较耗时, 虽然跟删掉重新建一个repo有些类似, 但是好处是保留了原有的更新记录, 所以还是有些不同的. 如果你实在不在意这些更新记录, 也可以删掉重建, 两者也差不太多, 也许后者还更直观些.

## 为了能从打了 tag 的版本中也删除你所指定的文件或文件夹,您可以使用这样的命令来强制推送您的 Git tags:

git push origin master --force --tags

4 Platz freimachen und zurückgewinnen

Obwohl wir die oben genannten Dateien gelöscht haben, verbleiben diese Objekte immer noch in unserem Repo und warten auf die Garbage Collection (GC). Daher müssen wir Befehle verwenden, um sie vollständig zu löschen und den Speicherplatz zurückzugewinnen.

Der Befehl lautet wie folgt:

rm -rf .git/refs/original/

git reflog expire --expire=now --all

git gc --prune=now

git gc --aggressive --prune=now

Jetzt können Sie sehen, ob die Dateigröße Ihres .git-Verzeichnisses kleiner geworden ist.

おすすめ

転載: blog.csdn.net/lixu1119545729/article/details/128864339