# ⚠️ Solución: .gitattributes No Funciona Durante Pull

## 🔍 Problema

Tienes el `.gitattributes` correcto con `merge=ours`, pero aún así los archivos protegidos se sobrescriben durante `git pull`.

## 🎯 Causas Posibles

### 1. .gitattributes No Estaba Commiteado

**Problema:** Si el `.gitattributes` estaba solo en el working directory pero no commiteado, Git no lo reconoce durante el pull.

**Solución:**
```bash
# Verificar si está commiteado
git ls-files .gitattributes

# Si NO aparece, commitearlo primero
git add .gitattributes
git commit -m "chore: Agregar .gitattributes con protecciones"
```

### 2. Pull Fast-Forward (Sin Merge)

**Problema:** Si el pull fue un fast-forward (sin merge), `merge=ours` no se aplica porque no hay merge.

**Solución:** Forzar un merge en lugar de fast-forward:
```bash
# Hacer pull con --no-ff para forzar merge
git pull --no-ff origin cd-system
```

### 3. Encoding o Formato del Archivo

**Problema:** Caracteres especiales o encoding incorrecto pueden hacer que Git ignore el archivo.

**Solución:**
```bash
# Verificar encoding
file .gitattributes

# Si hay problemas, recrear el archivo
rm .gitattributes
# Crear nuevo con encoding correcto (UTF-8)
nano .gitattributes
# Copiar contenido limpio
```

### 4. Git No Reconoce los Patrones

**Problema:** A veces Git necesita que los patrones estén más específicos.

**Solución:** Usar patrones más explícitos:
```gitattributes
# En lugar de solo:
config/cd-system.php merge=ours

# Usar también:
config/cd-system.php merge=ours -text
```

---

## ✅ Solución Completa y Definitiva

### Paso 1: Verificar Estado Actual

```bash
# Ver si .gitattributes está commiteado
git ls-files .gitattributes

# Ver historial de .gitattributes
git log --oneline -- .gitattributes

# Ver contenido actual
cat .gitattributes
```

### Paso 2: Asegurar que .gitattributes Está Commiteado

```bash
# Si NO está commiteado, agregarlo
git add .gitattributes
git commit -m "chore: Asegurar .gitattributes con protecciones"
```

### Paso 3: Usar Estrategia de Merge Explícita

```bash
# En lugar de solo: git pull origin cd-system
# Usar:
git pull --no-ff origin cd-system

# O configurar merge strategy globalmente:
git config pull.ff false
git pull origin cd-system
```

### Paso 4: .gitattributes Mejorado (Más Explícito)

```gitattributes
# Auto detect text files and perform LF normalization
* text=auto

# ============================================
# Archivos protegidos del proyecto
# Estos archivos mantienen la identidad del proyecto y NO deben ser sobrescritos
# durante merges o pulls desde cd-system. Se usa estrategia "ours" para mantener
# siempre la versión del proyecto.
# ============================================

# Configuración del proyecto (más explícito)
config/cd-system.php merge=ours -text
config/site.php merge=ours -text

# Logos del proyecto
public/cd-project/img/logos/** merge=ours
public/cd-project/img/logos/* merge=ours

# Favicons del proyecto
public/cd-project/img/favicon/** merge=ours
public/cd-project/img/favicon/* merge=ours

# Assets temporales/backup del proyecto
public/cd-project/assets/** merge=ours
public/cd-project/assets/* merge=ours
```

### Paso 5: Configurar Git para Siempre Usar Merge

```bash
# Configurar para que siempre haga merge (no fast-forward)
git config pull.ff false

# O configurar estrategia de merge
git config pull.rebase false
```

---

## 🔄 Proceso de Recuperación y Prevención

### 1. Recuperar Archivos (Si Ya se Sobrescribieron)

```bash
# Recuperar desde antes del pull
git checkout HEAD~1 -- config/cd-system.php config/site.php

# Verificar
cat config/cd-system.php | grep "demo"
cat config/site.php | grep -A 2 "'name'"

# Commitear
git add config/cd-system.php config/site.php
git commit -m "fix: Restaurar archivos protegidos"
```

### 2. Asegurar .gitattributes

```bash
# Verificar que está commiteado
git ls-files .gitattributes

# Si no está, commitearlo
git add .gitattributes
git commit -m "chore: Asegurar .gitattributes con protecciones explícitas"
```

### 3. Configurar Git para Pulls Seguros

```bash
# Configurar para siempre hacer merge (no fast-forward)
git config pull.ff false

# Verificar configuración
git config --list | grep pull
```

### 4. Hacer Pull Seguro

```bash
# Ahora hacer pull (siempre hará merge)
git pull origin cd-system

# Verificar que las protecciones funcionaron
cat config/cd-system.php | grep "demo"
cat config/site.php | grep -A 2 "'name'"
```

---

## 🛡️ Estrategia Alternativa: Usar Merge Driver Personalizado

Si `merge=ours` sigue sin funcionar, podemos crear un merge driver personalizado:

### Crear Merge Driver

```bash
# Crear script de merge driver
cat > .git/merge-ours.sh << 'EOF'
#!/bin/bash
# Merge driver que siempre mantiene nuestra versión
exit 0
EOF

chmod +x .git/merge-ours.sh

# Configurar en .git/config
git config merge.ours.driver '.git/merge-ours.sh %O %A %B'
```

### Usar en .gitattributes

```gitattributes
config/cd-system.php merge=ours
config/site.php merge=ours
```

---

## ✅ Checklist de Verificación

- [ ] `.gitattributes` está commiteado (`git ls-files .gitattributes`)
- [ ] `.gitattributes` tiene encoding correcto (UTF-8)
- [ ] Git configurado para hacer merge (`git config pull.ff false`)
- [ ] Pull se hace con `--no-ff` o merge automático
- [ ] Archivos protegidos verificados después del pull

---

## 🚀 Comando Todo-en-Uno (Solución Completa)

```bash
# 1. Recuperar archivos si se sobrescribieron
git checkout HEAD~1 -- config/cd-system.php config/site.php 2>/dev/null || true

# 2. Asegurar .gitattributes está commiteado
git add .gitattributes
git commit -m "chore: Asegurar .gitattributes" || true

# 3. Configurar Git para siempre hacer merge
git config pull.ff false

# 4. Verificar configuración
git config --list | grep pull

# 5. Hacer pull seguro
git pull origin cd-system

# 6. Verificar protecciones
cat config/cd-system.php | grep "demo"
cat config/site.php | grep -A 2 "'name'"
```

---

**Última actualización:** Diciembre 2024

