Saubere Git-Repositorys für die Veröffentlichung.
Entfernt Secrets, große Dateien und Binärdateien aus der gesamten Git-Historie – sicher und reproduzierbar.
Git-Sanitizer bereitet Git-Repositorys für die Veröffentlichung vor, indem es sensible und unnötige Dateien aus der kompletten Git-Historie entfernt. Anders als einfache .gitignore-Lösungen arbeitet das Tool mit git-filter-repo, um Dateien wirklich aus allen Commits zu tilgen – inklusive Reflog und GC.
- Open-Source: Repository vor der Veröffentlichung von internen Secrets/Configs befreien
- CI/CD-Pipelines: Automatisierte Prüfung auf auslaufende Secrets vor Build/Deploy
- Audit/Compliance: Nachweis, dass keine Secrets im Repository liegen
- Repository-Migration: Bereinigung vor dem Transfer zu einer öffentlichen Plattform
- Scanner: API-Keys, Tokens, Passwörter, große Dateien (>10MB), Binärdateien
- 14 Secret-Patterns: AWS/GCP/GitHub/GitLab/Heroku/Slack/Twitter/Datadog und mehr
git-filter-repo: Ausschließliche Nutzung des offiziellen Tools – keine eigenen Rewrite-Algorithmen- Berichte: Terminal (farbig), JSON, HTML, Markdown – einzeln oder alle auf einmal
- Trockenlauf (Dry-Run): Zeigt an, was entfernt würde, ohne die Historie zu verändern
- Branch-Filter: Nur einen bestimmten Branch bereinigen
- Severity-Filter: Ergebnisse ab einer Mindest-Schwere anzeigen (
--min-severity) - YAML-Konfiguration: Einfach per
settings.yaml– pro Projekt oder global - System-Check (
doctor): Prüft obgitundgit-filter-repoinstalliert sind - Integritätsprüfung: Nach der Bereinigung wird
git fsckausgeführt
- Ruby 3.3+
- git (getestet mit 2.30+)
- git-filter-repo – installiert und im
$PATH
gem install git-sanitizergit clone https://github.com/lynqtech/git-sanitizer.git
cd git-sanitizer
bundle install
bundle exec ruby bin/git-sanitizer helpgit-sanitizer initErzeugt eine settings.yaml im aktuellen Verzeichnis.
# settings.yaml
defaults:
remove:
directories:
- .claude
- .cursor
- .idea
- .vscode
files:
- .env
- .env.local
- .env.production
- credentials.yml
projects:
- name: mein-projekt
path: /pfad/zu/meinem/projektgit-sanitizer doctorgit-sanitizer scangit-sanitizer clean --dry-rungit-sanitizer clean --forceAchtung:
git-filter-repoüberschreibt unwiderruflich die Git-Historie.
Erstelle vorher ein Backup oder nutze--dry-run.
| Option | Beschreibung |
|---|---|
--config PATH |
Pfad zur settings.yaml (default: ./settings.yaml oder ~/.config/git-sanitizer/settings.yaml) |
git-sanitizer version # => 0.1.0git-sanitizer init # Erzeugt settings.yaml im aktuellen VerzeichnisErzeugt eine settings.yaml mit sinnvollen Defaults. Bestehende Datei wird nicht überschrieben.
git-sanitizer config # Zeigt die aktuelle Konfiguration anListet alle Projekte, deren Pfade und die zu entfernenden Dateien/Verzeichnisse auf.
git-sanitizer doctor # Prüft System-VoraussetzungenPrüft: Ruby-Version, Betriebssystem, Git-Installation, git-filter-repo-Installation, Projekt-Status.
git-sanitizer scan # Alle Projekte scannen
git-sanitizer scan -p mein-projekt # Nur bestimmtes Projekt
git-sanitizer scan -m high # Nur HIGH Findings anzeigen
git-sanitizer scan -p mein-projekt -m high # Kombiniert| Option | Kurz | Beschreibung |
|---|---|---|
--project |
-p |
Nur ein bestimmtes Projekt scannen |
--min-severity |
-m |
Mindest-Severity: high, medium, low |
Ausgabe: Farbige Terminal-Liste gruppiert nach Severity (🔴 HIGH, 🟡 MEDIUM, 🔵 LOW).
git-sanitizer clean # Alle Projekte bereinigen
git-sanitizer clean --dry-run # Trockenlauf
git-sanitizer clean --force # Wirklich bereinigen
git-sanitizer clean -y # Kurzform für --auto-confirm
git-sanitizer clean --branch main # Nur Branch "main" bereinigen
git-sanitizer clean --force --format json # Bereinigen + JSON-Report
git-sanitizer clean --force --format md # Bereinigen + Markdown-Report
git-sanitizer clean --force --format all # Bereinigen + alle Report-Formate| Option | Kurz | Beschreibung |
|---|---|---|
--project |
-p |
Nur ein bestimmtes Projekt bereinigen |
--dry-run |
— | Zeigt an, was entfernt würde (ohne Änderung) |
--force |
— | Bestätigung überspringen |
--auto-confirm |
-y |
Gefährliche Operationen automatisch bestätigen (impliziert --force) |
--branch |
— | Nur die Historie eines bestimmten Branches umschreiben |
--format |
-f |
Report-Format: terminal, json, html, md, all |
--output |
-o |
Ausgabeverzeichnis für Reports (default: ./reports) |
git-sanitizer report # Scan-Bericht für alle Projekte
git-sanitizer report -p mein-projekt # Nur für ein Projekt
git-sanitizer report -f json # Als JSON speichern
git-sanitizer report -f md -o ./docs # Als Markdown in docs/
git-sanitizer report -f all # Alle Formate
git-sanitizer report -m high # Nur HIGH Findings| Option | Kurz | Beschreibung |
|---|---|---|
--project |
-p |
Nur ein bestimmtes Projekt |
--format |
-f |
terminal, json, html, md, all |
--output |
-o |
Ausgabeverzeichnis (default: ./reports) |
--min-severity |
-m |
Mindest-Severity: high, medium, low |
| Format | Extension | Beschreibung |
|---|---|---|
terminal |
.txt |
Farbige Konsolenausgabe via Paint |
json |
.json |
Strukturiertes JSON für CI/CD-Pipelines |
html |
.html |
Eigenständige HTML-Seite mit CSS |
md |
.md |
Markdown – direkt in GitHub Issues/PRs einfügbar |
Beispiel Markdown-Report:
# Report for mein-projekt
**🔴 Findings:** 3 | **Scanned:** `/pfad/zu/projekt` | **Duration:** 0.45s
### Severity Breakdown
- 🔴 **HIGH**: 2
- 🟡 **MEDIUM**: 1
### Findings
| Severity | Type | File | Message |
|----------|------|------|---------|
| 🔴 HIGH | `secret` | `.env` | API key found |
| 🔴 HIGH | `secret` | `config/credentials.yml` | Password detected |
| 🟡 MEDIUM | `large_file` | `data/dump.bin` | File is 50MB |Die settings.yaml unterstützt zwei Ebenen: defaults (global) und projects (projekt-spezifisch). Projekte erben die defaults und können sie überschreiben.
defaults:
remove:
directories:
- .claude
- .cursor
- .continue
- .idea
- .vscode
- .DS_Store
files:
- .env
- .env.local
- .env.production
- credentials.yml
- Taskfile.yml
scan:
secrets: true
large_files: true
binaries: true
max_file_size_mb: 10
projects:
- name: open-source-lib
path: ~/code/oss/lib
# Nutzt defaults + keine eigenen remove-Einträge
scan:
secrets: true # Secret-Scanner aktiviert
- name: internal-tool
path: ~/code/work/tool
remove:
directories:
- node_modules # Zusätzlich zu defaults
files:
- .npmrc
scan:
secrets: false # Secret-Scanner deaktiviert
large_files: true./settings.yaml(aktuelles Verzeichnis)~/.config/git-sanitizer/settings.yaml(global)- Via
--config /pfad/zu/settings.yaml
lib/git_sanitizer/
├── cli.rb # Thor-CLI (Einstiegspunkt)
├── cli/
│ ├── scan_handler.rb # Scan-Logik
│ ├── clean_handler.rb # Clean-Logik
│ └── report_handler.rb # Report-Logik
├── configuration.rb # YAML-Konfiguration
├── project.rb # Projekt-Value-Object
├── scan_result.rb # Scan-Ergebnis (Data.define)
├── base_scanner.rb # Abstrakter Scanner
├── scanner_registry.rb # Registry für alle Scanner
├── scanners/
│ ├── secret_scanner.rb # 14 Patterns (API-Keys, Tokens)
│ ├── large_file_scanner.rb # Dateien >10MB
│ └── binary_scanner.rb # Binärdateien
├── cleaner.rb # git-filter-repo Orchestrierung
├── git.rb # Git-Kommandos
├── validator.rb # Systemprüfung
├── report.rb # Report-Data-Classes
├── report_renderer.rb # Abstrakter Renderer (Strategy)
├── terminal_report_renderer.rb # Terminal-Ausgabe
├── json_report_renderer.rb # JSON-Renderer
├── html_report_renderer.rb # HTML-Renderer
└── markdown_report_renderer.rb # Markdown-Renderer
git clone https://github.com/lynqtech/git-sanitizer.git
cd git-sanitizer
bundle installbundle exec rspec # Alle Tests
bundle exec rspec spec/cli # Nur CLI-Tests
bundle exec rspec --format documentation # Mit BeschreibungenAktuell: 305 Tests, 0 Failures, 90.93% Code-Coverage.
bundle exec rubocop # Linter
bundle exec rubocop -a # Automatische Korrekturen45 Dateien, 0 Rubocop-Offenses.
MIT License – siehe LICENSE.
- git-filter-repo – Das offizielle Tool zur Git-History-Umschreibung
- BFG Repo-Cleaner – Alternative (Scala-basiert)
- truffleHog – Secret-Scanning (nicht auf Git-History fokussiert)