git-filter-branch(1)
NAMN
git-filter-branch – Skriv om grenar
SYNOPSIS
git filter-branch [--setup <kommando>] [--subdirectory-filter <katalog>]
[--env-filter <kommando>] [--tree-filter <kommando>]
[--index-filter <kommando>] [--parent-filter <kommando>]
[--msg-filter <kommando>] [--commit-filter <kommando>]
[--tag-name-filter <kommando>] [--prune-empty]
[--original <namnrymd>] [-d <katalog>] [-f | --force]
[--state-branch <gren>] [--] [<rev-list-alternativ>...]
VARNING
git filter-branch har en mängd fallgropar som kan förvränga syftet med en omskrivning av historiken på oväntade sätt (och lämnar dig lite tid att felsöka problemen eftersom prestandan är usel). Dessa säkerhets- och prestandaproblem kan inte fixas utan att bryta bakåtkompatibilitet, och därför rekommenderas det inte att använda detta kommando. Använd istället ett alternativt verktyg såsom git filter-repo.
BESKRIVNING
Gör det möjligt att skriva om Git-historik genom att skriva om de grenar som anges i <rev-list-alternativ>, och tillämpa egna filter på varje commit. Filtren kan ändra varje träd (t.ex. ta bort en fil eller köra ett skript över alla filer) eller information om varje commit. Övrig information (t.ex. tidpunkter eller merge-information) bevaras.
Om inga filter anges kommer varje commit att göras om utan förändringar, vilket normalt sett inte ger någon effekt. Detta kan ändå vara användbart i framtiden för att kompensera för vissa Git-buggar.
Observera: detta kommando respekterar grafts i .git/info/grafts och ersättnings-referenser i refs/replace/. Att köra detta kommando gör dessa ändringar permanenta.
ALTERNATIV
- --setup <kommando>: Kör ett kommando en gång innan loopen börjar.
- --subdirectory-filter <katalog>: Fokusera endast på historik som berör denna katalog.
- --env-filter <kommando>: Ändra miljövariabler för commit.
- --tree-filter <kommando>: Modifiera det utcheckade trädets innehåll.
- --index-filter <kommando>: Modifiera indexet direkt (snabbare än tree-filter).
- --parent-filter <kommando>: Ändra en commits föräldrar.
- --msg-filter <kommando>: Ändra commit-meddelanden.
- --commit-filter <kommando>: Fullständig kontroll över hur commits skapas.
- --tag-name-filter <kommando>: Ändra taggnamn.
- --prune-empty: Ta bort tomma commits (ej merge-commits).
- --original <namnrymd>: Ange namnrymd för att spara originalreferenser.
- -d <katalog>: Temporär katalog för arbete.
- -f, --force: Tvinga omskrivning trots existerande refs/original.
- --state-branch <gren>: Spara tillståndet för att möjliggöra inkrementell körning.
- <rev-list-alternativ>: T.ex. --all, HEAD, master osv.
STATUSKODER
- 0: Lyckades.
- 2: Inga commits hittades.
- Annat: Fel inträffade.
EXEMPEL
Ta bort en fil från alla commits:
git filter-branch --tree-filter 'rm -f hemlig_fil.txt' HEAD
Snabbare variant:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch hemlig_fil.txt' HEAD
Extrahera en underkatalog som eget repo:
git filter-branch --subdirectory-filter bibliotekskod -- --all
Ändra commitförälder (t.ex. för att "klistra in" historik bakom en annan):
git filter-branch --parent-filter 'sed "s/^$/-p 123abc/"' HEAD
Ändra författarinformation:
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "root@localhost" ]; then
GIT_AUTHOR_EMAIL=john@example.com
fi
' -- --all
CHECKLISTA FÖR ATT MINSKA REPOSITORIESTORLEK
1. Ta bort alla varianter av filnamn (även efter flytt). 2. Filtrera alla refs, använd:
git filter-branch --index-filter ... --tag-name-filter cat -- --all
3. Kör sedan:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --prune=now
PRESTANDA
git-filter-branch är mycket långsam på grund av:
- Varje commit checkas ut, oavsett om det behövs.
- Shellkommandon körs för varje commit.
- Skriver många filer till disk.
- Skrivet i shell.
Använd git filter-repo istället: [[1](https://github.com/newren/git-filter-repo/)]
SÄKERHET
Vanliga fel:
- Kommandon fungerar inte på olika OS.
- Problem med filnamn med mellanslag eller icke-ASCII.
- Felaktig hantering av taggar.
- Oavsiktlig blandning av gammal och ny historik.
- Förändrade commitmeddelanden pekar på ogiltiga SHA-1.
GIT
Del av git(1)
SE ÄVEN
- git-filter-repo(1)
- git-commit-tree(1)
- git-update-index(1)
- git-clone(1)
- git-rev-list(1)
- git-rebase(1)
COLOPHON
Denna manual är del av Git-projektet. Källan finns på [2](https://github.com/git/git).
Version: Git 2.48.1.166.g58b580 Datum: 2025-01-31
Sidslut
Orginalhemsidan på Engelska https://man7.org/linux/man-pages/man1/git-filter-branch.1.html
Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
Tack till Datorhjälp Hemma som har sponsrat Linux.se med webbhotell.