Configuración de Git
Alias, hooks y valores predeterminados sensatos de Git para equipos de Python que usan uv, ruff y pytest localmente y en CI.
Receta
git config --global user.name "Ada Lovelace"
git config --global user.email "ada@acme.com"
git config --global pull.rebase true
git config --global fetch.prune true
git config --global alias.lg "log --oneline --graph -20"Cuándo usar esto:
- Configuración de un nuevo portátil para desarrolladores
- Estandarización del comportamiento de git del equipo mediante documentación + configuración de plantilla
- Adición de hooks de pre-commit que coincidan con GitHub Actions
- Habilitación de la firma de commits o firmas GPG/SSH
Ejemplo de Trabajo
# ~/.gitconfig (extracto)
[user]
name = Ada Lovelace
email = ada@acme.com
[pull]
rebase = true
[fetch]
prune = true
[init]
defaultBranch = main
[alias]
st = status -sb
sync = "!git fetch origin && git rebase origin/main"
cleanup = "!git branch --merged main | grep -v main | xargs git branch -d"# .pre-commit-config.yaml (repositorio)
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.0
hooks:
- id: ruff
- id: ruff-format
- repo: local
hooks:
- id: pytest-quick
name: pytest quick
entry: uv run pytest -q tests/unit
language: system
pass_filenames: falseLo que esto demuestra:
- Identidad global y valores predeterminados de rebase-en-pull
- Alias cortos para sincronización diaria
- pre-commit refleja las pruebas unitarias rápidas y el lint de CI
defaultBranch = mainpara nuevos repositorios
Análisis Profundo
Cómo Funciona
- Niveles de configuración - system < global < local < worktree; local sobrescribe global por repositorio.
- Hooks - Scripts en
.git/hooks/o gestionados por el framework pre-commit. - Atributos -
.gitattributespara nbstripout, LFS, generado por linguist. - Firmado - Firma de commits SSH (
gpg.format ssh) en Git moderno.
Configuraciones Recomendadas
| Configuración | Valor | Por qué |
|---|---|---|
pull.rebase | true | Integración lineal de características |
fetch.prune | true | Eliminar ramas remotas obsoletas |
rebase.autoStash | true | Rebase con árbol sucio (con cuidado) |
core.autocrlf | input en mac/linux | Evitar ruido CRLF en Python |
init.defaultBranch | main | Nombre de rama principal consistente |
Notas de Python
# Identidad local del repositorio para el portátil de trabajo
git config user.email "ada@acme.com"
# Asegurar que se ejecutan los hooks
uv run pre-commit install
uv run pre-commit run --all-filesTrampas Comunes
- Hooks globales que bloquean commits de trabajo en progreso - Pytest completo en cada commit ralentiza el flujo. Solución: subconjunto rápido de pruebas unitarias localmente; suite completa en CI.
- Sorpresa de autoStash - Entradas de stash ocultas después de rebase. Solución: higiene de
git stash list. - Correo electrónico incorrecto en los commits - Rompe el CLA y la auditoría. Solución:
git config user.emailpor repositorio para contratistas. - Omitir hooks con
--no-verify- Evita ruff en un commit de emergencia. Solución: permitir solo en caso de emergencia; arreglar antes de fusionar. - Saltos de línea de Windows - CRLF mixto falla ruff. Solución:
.gitattributes* text=auto eol=lf. - Firma de commit mal configurada - Rechazos de push. Solución: probar
git commit -S -m "test"en una rama primero.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Husky (Equipos Node) | Monorepo con JS + Python | Python puro - pre-commit es un ajuste nativo |
| Puertas solo de CI | Hooks bloqueados políticamente | Desarrolladores que envían ruff fallido a menudo |
git config --global includeIf | Repositorios de trabajo vs. personales en un portátil | Máquina de un solo empleador |
| Lista de verificación manual | Equipo pequeño | Escalar más allá de ~5 desarrolladores |
Preguntas Frecuentes
¿Pre-commit global o por repositorio?
Repositorio .pre-commit-config.yaml confirmado - todos comparten hooks; pre-commit install por clon.
¿Configuración de firma de commits SSH?
git config gpg.format ssh y user.signingkey a la ruta de la clave pública - GitHub verifica las firmas SSH.
¿Alias para PR de rama actual?
gh pr view --web o alias pr = "!gh pr view --web" después de hacer push.
¿Helper de credenciales en macOS?
Osxkeychain almacena tokens HTTPS; preferir SSH para operaciones de git.
¿Plantilla gitconfig para onboarding?
Enlace desde Lista de Verificación de Configuración del Entorno con bloque de copiar y pegar.
¿Excluir archivos globales con core.excludesfile?
~/.gitignore_global para .DS_Store, archivos IDE - complementa .gitignore del repositorio.
¿Revs de ignorar en blame?
.git-blame-ignore-revs para commits de formato masivo - arqueología más limpia.
¿Configuración de submódulos?
Raro en servicios Python - si se usa, submodule.recurse para comportamiento de clonación/pull.
¿Rendimiento de repositorios grandes?
feature.manyFiles true y clonación parcial git clone --filter=blob:none para monorepos enormes.
¿Deshabilitar rebase pull para un repositorio?
git config pull.rebase false override local al fusionar ramas de release frecuentemente.
Relacionados
- Comandos Esenciales de Git - comandos que los alias envuelven
- Git para Datos/Notebooks - atributos de nbstripout
- Linting y Formateo - ruff en hooks
- Lista de Verificación de Configuración del Entorno - configuración de nuevo desarrollador
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.