Files
2026-06-13 15:29:47 +02:00

5.9 KiB

Gitea — Comandos de Fluxo (commit · push · Branch+PR · ponteiro · nested · gitlink)

Referência prática do fluxo git deste stack. Servidor Gitea: git.clube67.com (SSH 10.99.0.3).

Topologia dos repositórios

/home/deploy/stack                 ← repo PAI (clube67_newwhats.local)
└── scoreodonto.com                 ← repo ANINHADO (gitlink, SEM .gitmodules)
Repo Caminho Remote
Pai /home/deploy/stack ssh://git@10.99.0.3/ruicesar/clube67_newwhats.local.git
Nested /home/deploy/stack/scoreodonto.com ssh://git@10.99.0.3/ruicesar/scoreodonto.com.git

O scoreodonto.com é um gitlink (entrada 160000 na árvore do pai), não um submódulo registrado em .gitmodules. O pai guarda só o SHA do commit do nested (o "ponteiro").

⚠️ Regra de ouro: ao publicar, nested PRIMEIRO, depois o pai — o ponteiro do pai precisa apontar para um commit que já exista no remoto do nested.

⚠️ NUNCA git push --force na main (destrói histórico compartilhado do Gitea).


1. Commit

Nested (mudanças de código em scoreodonto.com/)

cd /home/deploy/stack/scoreodonto.com
git add <arquivos>                  # ou: git add -A
git commit -m "feat(x): descrição

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"

Pai (configs/docs fora do nested)

cd /home/deploy/stack
git add <arquivos>
git commit -m "chore(infra): descrição"

2. Push direto na main (fast-forward)

Use quando a main local está à frente e 0 atrás do remoto.

cd /home/deploy/stack/scoreodonto.com   # ou o pai
git fetch origin
git rev-list --left-right --count main...origin/main   # confira "N  0" (0 atrás)
git push origin main

3. Branch + PR (quando quiser revisão antes da main)

cd /home/deploy/stack/scoreodonto.com
# empurra a branch (cria no remoto)
git push -u origin minha-branch
#   …ou empurrando a main local p/ uma branch remota sem checkout:
git push origin main:refs/heads/minha-branch

O Gitea responde com a URL do PR:

remote: Create a new pull request for 'minha-branch':
remote:   https://git.clube67.com/ruicesar/scoreodonto.com/pulls/new/minha-branch

Abrir o PR: acessar essa URL no navegador (não há gh/CLI p/ Gitea aqui).

Concluir o merge via git (alternativa à UI — só se for fast-forward)

git push origin minha-branch:main      # FF da branch p/ main remota

Após o merge: alinhar a main local

git fetch origin
git merge --ff-only origin/main        # main local = remota (sem mudar arquivos se a árvore for igual)

Limpar a branch mergeada

git branch -d minha-branch                      # local
git push origin --delete minha-branch           # remoto

Sempre depois que o commit do nested já está no remoto.

Forma simples (working tree do nested já no commit desejado)

cd /home/deploy/stack/scoreodonto.com
git rev-parse --short HEAD               # ex.: ca7eba4 (commit alvo, já pushado)

cd /home/deploy/stack
git add scoreodonto.com                  # captura o novo SHA do gitlink
git diff --cached scoreodonto.com        # confere: -<sha antigo> +<sha novo>
git commit -m "chore(infra): bump scoreodonto.com -> ca7eba4"
git push origin main

Forma não-destrutiva (sem mexer no checkout/HEAD do pai, preservando WIP)

Cria a branch via plumbing, útil quando o working tree do pai tem outras mudanças:

cd /home/deploy/stack
FULL=$(cd scoreodonto.com && git rev-parse HEAD)        # SHA completo do nested
export GIT_INDEX_FILE=/tmp/p.idx
git read-tree origin/main                                # base = main remota
git update-index --cacheinfo 160000,$FULL,scoreodonto.com
TREE=$(git write-tree)
COMMIT=$(git commit-tree $TREE -p origin/main -m "chore(infra): bump scoreodonto.com -> ${FULL:0:7}")
git branch -f minha-branch $COMMIT
unset GIT_INDEX_FILE; rm -f /tmp/p.idx
git push origin minha-branch                             # depois: PR ou ff p/ main

5. Verificações úteis

# Sincronia com o remoto (quer "0  0")
git fetch origin && git rev-list --left-right --count main...origin/main

# main local é fast-forwardável p/ o remoto?
git merge-base --is-ancestor main origin/main && echo "FF ok" || echo "divergiu"

# refs reais no servidor (sem cache local)
git ls-remote origin | grep -E "refs/heads/(main|<branch>)"

# valor atual do gitlink no pai
cd /home/deploy/stack && git ls-tree HEAD scoreodonto.com

6. Reconciliação quando divergiu (resumo seguro)

Quando local e remoto divergem mas o conteúdo local é superset (contém todo o trabalho remoto):

cd /home/deploy/stack/scoreodonto.com
git tag backup-pre-merge-$(date +%Y%m%d-%H%M%S) main     # backup
# provar superset: nenhum arquivo remoto-exclusivo, nenhuma rota/guard perdida
comm -23 <(git diff --name-only <base> origin/main|sort) <(git diff --name-only <base> main|sort)
git merge -s ours origin/main -m "merge: reconcilia (árvore local é superset do remoto)"
# validar antes de publicar: npx tsc --noEmit && npx vite build (em frontend/)

Alinhar a main do PAI preservando WIP (reset mixed, não --hard)

cd /home/deploy/stack
git fetch origin
git reset origin/main           # move ref+index p/ a remota; NÃO toca working tree (preserva WIP)

7. Deploy DEV (após mudar código)

dev.scoreodonto.com serve imagem buildada (não HMR) → rebuild manual:

cd /home/deploy/stack/scoreodonto.com
docker compose build scoreodonto-frontend && docker compose up -d --force-recreate scoreodonto-frontend
docker compose build scoreodonto-backend  && docker compose up -d --force-recreate scoreodonto-backend
# conferir bundle novo:
curl -s https://dev.scoreodonto.com/ | grep -oE '/assets/index-[A-Za-z0-9_]+\.js' | head -1