Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Git-Sanitizer

Saubere Git-Repositorys für die Veröffentlichung.
Entfernt Secrets, große Dateien und Binärdateien aus der gesamten Git-Historie – sicher und reproduzierbar.

CI


Übersicht

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.

Einsatzbereiche

  • 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

Features

  • 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 ob git und git-filter-repo installiert sind
  • Integritätsprüfung: Nach der Bereinigung wird git fsck ausgeführt

Installation

Voraussetzungen

  • Ruby 3.3+
  • git (getestet mit 2.30+)
  • git-filter-repo – installiert und im $PATH

Installation via Gem

gem install git-sanitizer

Oder aus dem Repository

git clone https://github.com/lynqtech/git-sanitizer.git
cd git-sanitizer
bundle install
bundle exec ruby bin/git-sanitizer help

Schnellstart

1. Konfiguration erzeugen

git-sanitizer init

Erzeugt eine settings.yaml im aktuellen Verzeichnis.

2. Konfiguration anpassen

# 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/projekt

3. System-Check

git-sanitizer doctor

4. Scan (prüfen ohne zu ändern)

git-sanitizer scan

5. Bereinigen (Trockenlauf)

git-sanitizer clean --dry-run

6. Bereinigen (wirklich)

git-sanitizer clean --force

Achtung: git-filter-repo überschreibt unwiderruflich die Git-Historie.
Erstelle vorher ein Backup oder nutze --dry-run.


CLI-Referenz

Global

Option Beschreibung
--config PATH Pfad zur settings.yaml (default: ./settings.yaml oder ~/.config/git-sanitizer/settings.yaml)

version

git-sanitizer version      # => 0.1.0

init

git-sanitizer init          # Erzeugt settings.yaml im aktuellen Verzeichnis

Erzeugt eine settings.yaml mit sinnvollen Defaults. Bestehende Datei wird nicht überschrieben.

config

git-sanitizer config        # Zeigt die aktuelle Konfiguration an

Listet alle Projekte, deren Pfade und die zu entfernenden Dateien/Verzeichnisse auf.

doctor

git-sanitizer doctor        # Prüft System-Voraussetzungen

Prüft: Ruby-Version, Betriebssystem, Git-Installation, git-filter-repo-Installation, Projekt-Status.

scan

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

clean

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)

report

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

Report-Formate

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 |

Konfiguration

Die settings.yaml unterstützt zwei Ebenen: defaults (global) und projects (projekt-spezifisch). Projekte erben die defaults und können sie überschreiben.

Vollständiges Beispiel

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

Config-Pfad-Suche

  1. ./settings.yaml (aktuelles Verzeichnis)
  2. ~/.config/git-sanitizer/settings.yaml (global)
  3. Via --config /pfad/zu/settings.yaml

Architektur

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

Entwicklung

Setup

git clone https://github.com/lynqtech/git-sanitizer.git
cd git-sanitizer
bundle install

Tests ausführen

bundle exec rspec              # Alle Tests
bundle exec rspec spec/cli     # Nur CLI-Tests
bundle exec rspec --format documentation  # Mit Beschreibungen

Aktuell: 305 Tests, 0 Failures, 90.93% Code-Coverage.

Code-Qualität

bundle exec rubocop            # Linter
bundle exec rubocop -a         # Automatische Korrekturen

45 Dateien, 0 Rubocop-Offenses.


Lizenz

MIT License – siehe LICENSE.


Verwandte Projekte

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages