GitHub: sergiovelasquezzeballos/hammer -> takana (sigue privado). El segundo pushurl del origin y el default de espejo-setup.sh actualizados; push real verificado contra los DOS destinos. Las dos colas las encontro hammer-4a y las verifique antes de aplicarlas: 1) CINCO scripts hardcodeaban /home/sergio/hammer y hoy funcionaban SOLO por el symlink que puse al mover. El peor era respaldo-storagebox.sh, cuya RAIZ por defecto salia de ahi: si alguien limpia el symlink dando el renombre por cerrado, el RESPALDO apunta a una ruta inexistente. Un respaldo que no encuentra su raiz no falla ruidosamente — se descubre el dia que lo necesitas. Ahora apuntan a /mnt/vvv/takana, la ruta real, sin depender de ningun enlace. 2) Cuatro referencias a gitea.gioser.net/sergio/hammer. El diagnostico del peer era el correcto y lo comprobe: ese HOST no resuelve, y no por el renombre — ya estaba mal antes, el remoto real es git.gioser.net. Cambiar solo hammer->takana las habria dejado igual de rotas. Van a https://git.gioser.net/sergio/takana, que responde 200.
96 lines
4.5 KiB
Bash
Executable File
96 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# espejo-setup.sh — deja este clon con espejo doble y con git endurecido contra cortes sucios.
|
|
#
|
|
# POR QUÉ EXISTE: las dos cosas que configura viven en `.git/config`, que **no se versiona**. Es
|
|
# decir: se pierden exactamente en el escenario para el que se pusieron (el laptop muere, clonás de
|
|
# nuevo). Este script las vuelve a poner en un paso, y es idempotente, así que se puede correr sobre
|
|
# un clon ya configurado sin duplicar nada.
|
|
#
|
|
# QUÉ CONFIGURA
|
|
#
|
|
# 1. PUSH A LOS DOS REMOTOS. `origin` fetchea de gitea (canónico) pero empuja a gitea Y a GitHub.
|
|
# Se hace con `--add --push` en vez de un remoto `github` aparte para que TODO `git push origin
|
|
# main` que ya existe en los scripts (p.ej. cosecha-cron.sh) espeje solo, sin tocar un script.
|
|
# Motivo del espejo (2026-07-22): git.tawasuyu.net resuelve a gioser, marcado como FIJO y SIN
|
|
# BACKUP. Sin GitHub, las dos únicas copias eran el laptop —que ya se corrompió una vez por un
|
|
# corte sucio— y esa. El espejo es PRIVADO.
|
|
#
|
|
# OJO con la credencial: las claves SSH del laptop son todas DEPLOY KEYS de otros repos (dan
|
|
# "Repository not found" contra este). Por eso el remoto de GitHub va por HTTPS con el token de
|
|
# `gh` como credential helper. Si `gh auth status` no está logueado, esto no va a empujar.
|
|
#
|
|
# Si GitHub está caído o el token venció, `git push origin main` devuelve != 0 aunque gitea haya
|
|
# aceptado. cosecha-cron.sh ya lo tolera (loguea "push falló, reintenta próximo ciclo"), así que
|
|
# el latido no se rompe por eso.
|
|
#
|
|
# 2. GIT CON fsync. git 2.55 NO fsyncea los loose objects por defecto. Con un kernel rc que corta
|
|
# sucio, ext4 deja el inode con su mtime y el contenido en cero: el 2026-07-22 eso dejó 6 objects
|
|
# vacíos + refs + reflog en NULs y el repo con "fatal: bad object HEAD". Se recuperó entero sólo
|
|
# porque el push a gitea había llegado. Con esto, no vuelve a pasar por esa vía.
|
|
#
|
|
# Uso: scripts/espejo-setup.sh [--check]
|
|
set -uo pipefail
|
|
|
|
GITHUB="${GITHUB:-https://github.com/sergiovelasquezzeballos/takana.git}"
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
cd "$ROOT"
|
|
|
|
# El gitea canónico NO se hardcodea: se lee del origin de ESTE clon. Motivo (2026-08-10, gioser):
|
|
# estaba fijo en `ssh://…git.tawasuyu.net:2345/…` y el clon de gioser fetchea de
|
|
# `gitea@git.gioser.net:…` — misma máquina, pero otra forma de URL y otro puerto. Correrlo tal cual
|
|
# hacía `--unset-all` y le cambiaba el destino canónico al clon sin decir nada, que es la clase de
|
|
# cambio que no se nota hasta que un push va a donde no era. El fallback sólo aplica si no hay origin.
|
|
GITEA="${GITEA:-$(git remote get-url origin 2>/dev/null)}"
|
|
GITEA="${GITEA:-ssh://gitea@git.tawasuyu.net:2345/sergio/takana.git}"
|
|
|
|
CHECK=0
|
|
[ "${1:-}" = "--check" ] && CHECK=1
|
|
|
|
ok() { printf ' ✓ %s\n' "$1"; }
|
|
warn() { printf ' ⚠ %s\n' "$1"; }
|
|
|
|
echo "espejo-setup en $ROOT"
|
|
|
|
# --- 1. push a los dos ---
|
|
actuales="$(git remote get-url --push --all origin 2>/dev/null || true)"
|
|
falta=0
|
|
printf '%s\n' "$actuales" | grep -qF "$GITEA" || falta=1
|
|
printf '%s\n' "$actuales" | grep -qF "$GITHUB" || falta=1
|
|
|
|
if [ "$falta" = "0" ]; then
|
|
ok "origin ya empuja a gitea y a GitHub"
|
|
elif [ "$CHECK" = "1" ]; then
|
|
warn "origin NO empuja a los dos (corré sin --check para arreglarlo)"
|
|
else
|
|
# Reconstruir de cero: los pushurl son acumulativos y re-correr sin limpiar duplicaría.
|
|
git config --unset-all remote.origin.pushurl 2>/dev/null || true
|
|
git remote set-url --add --push origin "$GITEA"
|
|
git remote set-url --add --push origin "$GITHUB"
|
|
ok "origin empuja ahora a gitea y a GitHub"
|
|
fi
|
|
|
|
# --- 2. fsync ---
|
|
FSYNC="loose-object,pack,pack-metadata,commit-graph,index,reference"
|
|
if [ "$(git config --get core.fsync 2>/dev/null)" = "$FSYNC" ]; then
|
|
ok "core.fsync ya endurecido"
|
|
elif [ "$CHECK" = "1" ]; then
|
|
warn "core.fsync SIN endurecer (corré sin --check para arreglarlo)"
|
|
else
|
|
git config core.fsync "$FSYNC"
|
|
git config core.fsyncMethod fsync
|
|
ok "core.fsync endurecido"
|
|
fi
|
|
|
|
# --- credencial de GitHub: avisar temprano, no fallar al primer push ---
|
|
if command -v gh >/dev/null 2>&1; then
|
|
if gh auth status >/dev/null 2>&1; then
|
|
ok "gh autenticado (el push a GitHub va por HTTPS con su token)"
|
|
else
|
|
warn "gh NO autenticado ⇒ el push a GitHub va a fallar. Corré: gh auth login && gh auth setup-git"
|
|
fi
|
|
else
|
|
warn "no hay gh instalado ⇒ el push a GitHub va a fallar. Instalalo y corré: gh auth login && gh auth setup-git"
|
|
fi
|
|
|
|
echo "listo. Verificar: git push origin main (debe reportar DOS veces, una por remoto)"
|