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!