26 Punkte von GN⁺ 2026-02-21 | 4 Kommentare | Auf WhatsApp teilen
  • In internen CIA-Entwicklungsdokumenten wurde ein einfacher Befehl entdeckt, der das alte Problem des Aufräumens von Git-Branches löst
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
  • Der Befehl löscht aus der Ausgabe von git branch --merged alle gemergten Branches gesammelt, außer dem aktuellen Branch und master
  • Es gibt auch eine für moderne Projekte angepasste Version, die main und develop ausnimmt
  • Der Befehl kann als Git-Alias registriert werden, um wiederkehrende Aufgaben zu automatisieren, und ist trotz seiner Einfachheit ein nützliches Werkzeug für dauerhafte Effizienzgewinne und ein aufgeräumtes Repository

Ein in Vault7 entdeckter Git-Tipp

  • Die 2017 von WikiLeaks veröffentlichten Vault7-Dokumente enthielten die Hacking-Tools der CIA und interne Entwicklungsdokumente
    • Auf einer dieser Seiten fand sich eine Sammlung von Git-Tipps und -Tricks, darunter meist übliche Hinweise zu Commit-Korrekturen, Stash und der Verwendung von bisect
  • Ein dort gefundener Einzeiler ist bis heute in meiner ~/.zshrc erhalten geblieben

Das Problem mit alten Branches

  • In lokalen Git-Repositories sammeln sich mit der Zeit gemergte Branches an, was das Aufräumen erschwert
    • Feature-Branches, Hotfixes und experimentelle Branches bleiben nach dem Merge bestehen, sodass die Ausgabe von git branch unübersichtlich wird
  • Mit git branch --merged lassen sich gemergte Branches anzeigen, aber das manuelle Löschen ist umständlich

Der ursprüngliche Befehl aus dem CIA-Dokument

  • Der ursprünglich vorgeschlagene Befehl lautet
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d  
    
  • Erläuterung der Bestandteile
    • git branch --merged: Gibt eine Liste aller lokalen Branches aus, die in den aktuellen Branch gemergt wurden
    • grep -v "\*\|master": Schließt den aktuellen Branch (*) und master aus
    • xargs -n 1 git branch -d: Löscht die übrigen Branches sicher einzeln (-d löscht keine nicht gemergten Branches)

Modernisierte Version des Befehls

  • Da die meisten Projekte den Branch main verwenden, kann der Befehl wie folgt angepasst werden
    git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d  
    
  • Wenn man ihn nach dem Deployment auf dem Branch main ausführt, reduziert sich eine lange Liste von Branches auf nur noch wenige
  • Der Befehl kann als Git-Alias registriert werden, um ihn bequem auszuführen
    alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'  
    
    • Danach genügt im Repository der Befehl ciaclean, um das Aufräumen automatisch auszuführen

Effizienz und Praxistauglichkeit

  • Dieser Befehl spart jede Woche ein paar Minuten und hilft dabei, die Branch-Liste sauber zu halten
  • Er gilt als einfaches, aber praktisches Werkzeug, das kontinuierliche Produktivitätsgewinne bringt

4 Kommentare

 
foriequal0 2026-02-21

In den HN-Kommentaren gibt es offenbar jemanden, der ein Programm verwendet, das ich erstellt habe.

I use git-trim for that:
https://github.com/foriequal0/git-trim
In der Readme wird auch erklärt, warum es in manchen Fällen besser ist als ein Bash-Einzeiler.
https://news.ycombinator.com/item?id=47089533

 
youngminz 2026-02-21

Ich verwende auch einen Alias namens git gone. Sehr praktisch. - alias.gone = ! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '$2 == "[gone]" {print $1}' | xargs -r git branch -D

 
a1eng0 2026-02-21

Ich verwende zum Aufräumen zwar kein reines Git, sondern das Tool gh-poi.

https://github.com/seachicken/gh-poi

 
GN⁺ 2026-02-21
Hacker-News-Kommentare
  • Ich verwende einen Alias namens git tidy, um Branches aufzuräumen
    Die Standard-Branches (main, master) werden nicht gelöscht, und weder der aktuelle Branch noch Branches in anderen worktrees werden angetastet
    Branches, die auf dem Remote verschwunden sind, werden ebenfalls automatisch gelöscht, und der Code steht in meinen dotfiles

    • init.defaultBranch zu verwenden ist riskant. Der Name des Standard-Branches kann je nach Repository unterschiedlich sein, und diese Einstellung ist global, also muss sie vorab festgelegt werden
      Ich habe deshalb einen Alias namens git default gebaut, der den tatsächlichen Standard-Branch automatisch vom Remote (origin) ermittelt
    • Dieses Skript ist wirklich nützlich, also wäre ein Beitrag zu git extras sinnvoll
  • Ich nutze einen Cleanup-Befehl, der in fzf integriert ist
    Damit kann ich gemergte Branches vorab auswählen und gesammelt löschen, auf Wunsch aber auch einzelne ausschließen
    Remote-Branches werden ebenfalls mit aufgeräumt, und der Code steht in meiner .gitconfig
    Außerdem verwende ich die Variable user.primaryBranch, um je Repository unterschiedliche Standard-Branches festzulegen

    • Ich denke, man könnte stattdessen auch init.defaultBranch verwenden. Selbst bei bereits initialisierten Repositories funktioniert es, wenn man git config --local init.defaultBranch main setzt
    • Man kann auch von einem anderen Branch pullen, ohne den Branch zu wechseln. Zum Beispiel mit git pull origin main:main und danach git rebase main
  • git branch --merged funktioniert in Repositories, die squash merge verwenden, nicht zuverlässig
    Der Grund ist, dass die SHA des gesquashten Commits sich vom HEAD des ursprünglichen Branches unterscheidet
    Mich würde interessieren, ob es ein Tool gibt, das gesquashte Branches sicher erkennen kann

    • Ich habe mein Skript kürzlich so geändert, dass es nur löscht, wenn „in den letzten 30 Tagen kein Commit“ + „kein Branch mehr auf dem Remote“ gilt
      Das ist nicht perfekt, aber praktisch genug, und vor dem Löschen erscheint immer eine Bestätigungsabfrage
      Ich habe mich dabei an der Einstellung zur automatischen Branch-Löschung von GitHub orientiert
    • Nicht nur squash merge, sondern auch rebase merge wird nicht erkannt
      Die meisten hängen dafür einen Hook an das Löschen des Remote-Branches
    • Ich lösche den lokalen Branch einfach dann, wenn der Remote-Branch verschwunden ist
      Dafür verwende ich einen Alias namens git gone, der nach git fetch -p Branches im Status [gone] aufräumt
    • Ich arbeite in einer Umgebung mit Gerrit, deshalb passieren Rebase-Vorgänge auf dem Server
      Deshalb nutze ich ein Skript, das git branch --merged, git cherry und git log grep kombiniert
      Allerdings kann es Fehlalarme geben, wenn Commits per amend geändert wurden oder mehrere Commits beteiligt sind
    • Wenn man zuerst ein Rebase auf den Branch versucht, könnte man vielleicht einen leeren Branch erkennen
  • Ich räume gemergte Branches mit einem Alias namens git lint auf
    main, master und stable werden dabei ausgelassen, und ich verwende oft die Kombination git pull --prune && git lint

  • Der Git-Befehl selbst ist unspektakulär, aber ich fand es interessant, beim Herumklicken auf ein Dokument aus einer Wikileaks-Quelle zu stoßen
    Das „Fine Dining“-Projekt der CIA war ein Tool, das auf USB-Sticks versteckte Malware als App tarnte

    • Das klingt eher nach klassischer Spionagetechnik. Wirklich verrückt waren eher Experimente wie MKULTRA, bei denen Menschen heimlich LSD verabreicht wurde
  • Das ursprüngliche Problem ließe sich eigentlich schon dadurch lösen, dass man einfach nur eine Liste nicht gemergter Branches ausgibt

  • Es ist seltsam, dass so ein natürlicher Arbeitsablauf mehrere Zeilen Bash braucht
    Angesichts der Größe der Git-Codebasis ist es schade, dass es dafür keine eingebaute Funktion gibt
    Siehe auch diesen Blogbeitrag

    • Aber wenn man xargs oder eine for-Schleife ein bisschen beherrscht, ist das eine Kleinigkeit
      Als eingebauter Befehl müsste es viele Sonderfälle behandeln und würde dadurch eher komplizierter werden
    • So etwas nach der „Anzahl der Codezeilen“ zu bewerten, wirkt wie ein seltsamer Maßstab
  • Am Ende gab es auch Reaktionen wie: „Klingt, als hätte da jemand gerade erst xargs gelernt“

    • So eine Haltung wirkt wie Gatekeeping. Es ist gut, neu Gelerntes zu teilen
      Ich selbst habe solche Dinge früher auch aus Blogs und Artikeln gelernt
    • Aber dass jemand das aus einem CIA-Dokument gelernt hat, sagt auch etwas über die Generation aus. Heute lernt man eher im Internet als in der Schule
    • Es gab zwar negative Reaktionen, aber gerade solche Utility-Kombinationen machen den Reiz der CLI aus
    • Egal ob aus einer CIA-Quelle oder anderswo: Wenn jemand gerade xargs gelernt hat, ist das an sich schon etwas Cooles
    • Aus Sicht der Bell-Labs-Generation mag das alles extrem grundlegend wirken
  • Ich bin derzeit regelrecht TUI-süchtig. Wenn mich etwas stört, bitte ich Claude Code einfach, mir dafür eine TUI zu bauen
    Mit der Textual-Bibliothek habe ich eine TUI zur Verwaltung von Git-Worktrees gebaut, und Claude kommt mit Python-Code ziemlich gut zurecht

    • Empfohlen wurde mir auch tig, eine ältere Git-TUI. Auch zur Inspiration ist das gut
    • Manche meinten, sie hätten Sorge, dass von Claude geschriebener Code ein Git-Repository beschädigen könnte
    • Es gab auch Leute, die nicht wussten, was eine TUI ist
    • Für Git-TUIs wird Magit sehr empfohlen. Das hilft auch beim Lernen
      Auch dieser Artikel über die Rebase-Funktion von Magit ist lesenswert
    • Ich habe selbst viele kleine Tools mit Claude gebaut. Mich würde interessieren, ob sie Open Source veröffentlicht wurden
  • Ich habe etwas Ähnliches auch in der Fish-Shell umgesetzt
    Es ist eine Funktion, mit der man per fzf Branches auswählen und löschen kann, die auf dem Remote verschwunden sind
    Der Code steht in meinen dotfiles