When you delete a file in Git, it still remains in the Git repository history.
This skill guides users to use the git filter-repo tool to permanently delete specified files from the complete history of a Git repository.
Ask the user to confirm:
Must wait for user confirmation before proceeding with subsequent steps.
Before performing any operations, backup the repository first:
# Method 1: Copy the entire repository directory
cp -r your-repo your-repo-backup
# Method 2: Create a bare repository backup
git clone --bare your-repo your-repo-backup.git
Choose installation method based on your operating system:
macOS:
brew install git-filter-repo
Ubuntu / Debian:
pip install git-filter-repo
Windows:
pip install git-filter-repo
After entering the repository directory, check:
git status
git remote -v
If there's no remote repository, add one first:
git remote add origin git@github.com:username/repository.git
Assuming the file to delete is secrets.txt:
git filter-repo --path secrets.txt --invert-paths
What this step does:
Delete multiple files:
git filter-repo --path file1.txt --path file2.txt --path secrets/ --invert-paths
Delete entire directory:
git filter-repo --path directory-name/ --invert-paths
Check if the file still exists in history:
git log --all -- filename
If there's no output, the file has been completely removed.
Because the history has been rewritten, a force push is required:
# Push all branches
git push origin --force --all
# Push all tags
git push origin --force --tags
If you deleted sensitive information (keys, tokens, passwords, private keys), in addition to deleting history, you should also:
Important Reminder: Just because history is deleted doesn't mean others haven't copied it before. Once sensitive information is committed to a public repository, it should be considered leaked.
Because the commit history has changed, other people's local repositories will be inconsistent with the remote. You need to notify them:
```bash
git fetch origin
git reset --hard origin/main # Will lose unpushed local changes, use with caution
```
Make sure you're executing commands in the Git repository root directory.
Install git-filter-repo first, refer to the installation steps above.
Run garbage collection:
git gc --aggressive --prune=now
If the file is only in the most recent commit, you don't need filter-repo, use:
git rm --cached filename
git commit --amend
The most core commands:
# Delete file
git filter-repo --path filename --invert-paths
# If no remote, add first
git remote add origin <repo-url>
# Force push
git push origin --force --all
git push origin --force --tags
共 1 个版本