Už som písal o tom, aký užitočný nástroj je git filter-repo na čistenie repozitárov. Od tej doby som nadobudnuté znalosti poriadne využil a napravil niekoľko predchádzajúcich zlých rozhodnutí vo svojich súkromných repozitároch.

Tu je zoznam príkazov na zlúčenie project-a do project-b pre ďalšie použitie.

Voliteľné: Vrátenie git LFS #

V závislosti od zložitosti projektu môžete voliteľne zvážiť vrátenie LFS stavu súborov v repozitári project-a:

git lfs migrate export --include="*" --everything

Skontrolujte, či naozaj žiadne súbory nemajú stav Large File Storage (LFS):

git lfs ls-files

Teraz môže byť bezpečné odstrániť aj akúkoľvek zmienku o súbore .gitattribute, ktorý sa používa na uchovávanie informácií o tom, ktoré súbory má LFS sledovať:

git filter-repo --path .gitattributes --invert-paths

LFS súbory môžete neskôr znova importovať.

Príprava: Adresárová štruktúra #

Začnite presunutím project-a o úroveň hlbšie do adresárovej štruktúry pri zachovaní histórie gitu pomocou skratky pre cestu:

cd path/to/project-a
git-filter-repo --to-subdirectory-filter $(basename "$PWD")

Potvrďte spustením ls. Objaviť by sa mal iba adresár project-a.

Zlúčenie #

Teraz je project-a pripravený na integráciu do project-b:

cd /path/to/project-b
git remote add project-a /path/to/project-a
git fetch project-a --tags
git merge --allow-unrelated-histories project-a/master
git remote remove project-a

Po potvrdení merge commitu by mal byť adresár project-a obsiahnutý v project-b. Ak sa chcete zbaviť merge commitu, urobte interaktívny rebase:

git rebase --interactive HEAD~

Potvrdenie dialógu git rebase bez akýchkoľvek úprav (každý riadok by mal začínať kľúčovým slovom pick) by malo stačiť.

Voliteľné: Opätovné podpísanie každého commitu #

Ak chcete zverejniť vyčistený repozitár, môže stáť za to pridať GPG podpis ku commitom, keďže zmena histórie pomocou rebase alebo priamo cez nástroj git-filter-repo môže podpisy pokaziť.

Poznámka: pred pokračovaním v tomto kroku sa uistite, že ste jediným prispievateľom do repozitára. Tiež, ak je repozitár veľmi starý, emailová adresa priradená ku commitu môže vyžadovať aktualizáciu, napríklad pomocou príkazu git-filter-repo --use-mailmap.

Písal som o opätovnom podpisovaní predchádzajúcich commitov, tak si to pozrite. Stručne:

git rebase --exec 'git commit --amend --no-edit --no-verify -S' -i --root
git rebase --committer-date-is-author-date -i --root

Zlúčený repozitár by mal byť pripravený na odosielanie na svoje nové miesto!

Odkazy #