Změna vlastnictví commitů v Gitu

📅   08. 03. 2022
👤   Jan Barášek

Při migraci repositářů mezi organizacemi se často stává, že potřebujeme přepsat vlastníky commitů. Důvodem může být převod commitů z jednoho účtu na druhý například z důvodu změny e-mailové adresy uživatele.

Například jsem potřeboval převést všechny commity ze starého e-mailu na Seznamu na můj druhý účet na Gmailu. Druhý případ, kdy mohu takovou změnu požadovat, je okamžik, kdy omylem commitnu pod soukromým e-mailem, ale konkrétní firma chce commity pod jejich doménou.

Na řešení tohoto problému naštěstí existuje příkaz, který stačí zavolat v masteru projektu a přepsat tím celou historii:

git filter-branch --env-filter "
if [ \"\$GIT_COMMITTER_EMAIL\" = \"[email protected]\" ]
then
    export GIT_COMMITTER_NAME=\"Jan Barášek\"
    export GIT_COMMITTER_EMAIL=\"[email protected]\"
fi
if [ \"\$GIT_AUTHOR_EMAIL\" = \"[email protected]\" ]
then
    export GIT_AUTHOR_NAME=\"Jan Barášek\"
    export GIT_AUTHOR_EMAIL=\"[email protected]\"
fi
" [email protected] --tag-name-filter cat -- --branches --tags

Po provedení příkazu je potřeba změny flushnout do masteru příkazem git push -f.

Pozor:

Po provedení příkazu dojde k přepsání celé historie commitů a změně hashů. Jde o BC break, který by měl nastat jen výjimečně. Pokud uděláte při přepsání commitů chybu, nelze historii obnovit. Zároveň je potřeba smazat nebo přepsat všechny větve, jinak dojde ke konfliktu nad všemi změněnými commity, které se po vyřešení zapíšou zdvojeně (původní a nový commit).

Jan Barášek     Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Kontakt Spolupráce