Merge de backups

2024-01-28 computer blog

Resolvi acabar de vez com os backups independentes das inúmeras versões do blogue e juntar em um único histórico. Para isso recorri ao bom e velho merge clássico, apenas juntando linhas de história não-relacionadas.

Preparativos

Antes de tudo é preciso ter todas as pastas com os repos locais acessíveis. Eles irão virar branches dentro do repo atual. Dentro de seu repositório atual use o comando git fetch para "baixar" o conteúdo dos outros repos "remotos". Em Windows o drive C: começa em /c/. Eu tenho quatro repositórios que foram criados de maneira independente em meus backups.

git fetch /c/Users/caloni/projects/blog/old_repo master:old_repo

Depois ao observar a data do último commit de cada repo podemos traçar a cronologia de qual o mais antigo para o mais novo:

git log -1 oldest_repo
commit bd55f443417a56c2f717f53d35508420a10bda51 (HEAD -> oldest_repo)
Date:   Sat Mar 7 21:01:39 2015 -0300

git log -1 old_repo
commit 6a2eea4c5e876b602c789c1b727a01c2e0159af1 (old_repo)
Date:   Tue Mar 22 09:01:39 2016 -0300

git log -1 not_so_old_repo
commit 343c713273bf273ab8439af15de817f6335e00ab (not_so_old_repo)
Date:   Tue Jul 11 14:13:50 2017 -0300

git log -1 master
commit 0de0e65389aaca984a48eb5294e224dbdcdda1b5 (origin/master, origin/HEAD, master)
Date:   Sat Jan 27 09:00:49 2024 -0300

Com base nisso renomeamos a branch master do repositório atual para current e a branch com o commit mais antigo para master. A ideia é começar com a master mais antiga e ir mergeando as outras branches até chegar na current. Ao final teremos uma master com todo o histórico passado, ainda que não-relacionado.

git checkout master
git branch -m current
git checkout oldest_repo
git branch -m master

O resto é uma sequência de comandos merge sem o commit para antes limparmos o diretório de trabalho e reproduzirmos o estado exato dos arquivos no último commit de cada branch. Para isso é mais fácil apagar todos os arquivos e copiar os arquivos que estão em cada um dos repos.

git merge --allow-unrelated-histories -X theirs --no-commit next_repo
rm -fr *
cp -r ../next_repo/* .
git commit

Por fim podemos apagar as branches de repos remotos, colocar tag nos merges feitos ou nenhum dos dois. A organização é sua. Todo o histórico está junto agora. Pode apagar os backups.

[comment] [Corrigindo EPUB encoding]