¿Alguna vez has intentado trabajar con Power Pages en modo local y te has encontrado con commits innecesarios, archivos que no paran de cambiar o conflictos difíciles de rastrear?
Microsoft propone trabajar directamente online, pero eso limita el control de versiones y el trabajo colaborativo.
Vamos a ver cómo configurar correctamente tu entorno local con Git para trabajar con Power Pages de forma limpia, eficiente y sin sobresaltos.
El problema: pac powerpages download y los commits fantasma
Si optas por mantener el portal en un repositorio Git (como debería ser en entornos profesionales), notarás un problema grave: Cuando usamos la herramienta pac powerpages download para traer los archivos del portal a nuestro entorno local, es común que se generen cambios en archivos que no hemos tocado.
Esto provoca commits innecesarios y complica el control de versiones, especialmente en equipos que trabajan con flujos CI/CD, porque hace imposible distinguir cambios reales.
La solución: estructura limpia y controlada
La clave está en separar claramente los archivos que deben versionarse de los que no. Para ello, puedes usar un script en PowerShell que:
- Descarga el portal en una carpeta temporal
- Compara línea a línea el contenido real con los archivos locales
- Solo reemplaza los archivos que realmente han cambiado
Este enfoque evita que Git detecte cambios irrelevantes y mejora la trazabilidad de tus commits consiguiendo:
- Git solo detecta cambios verdaderos
- Mayor control de versiones
- Trabajo en equipo más limpio y seguro
- Evitas pérdida de funcionalidad inadvertida
- Ideal para CI/CD o equipos colaborativos
Aquí tienes el script:
# Parámetros
$websiteId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"
$targetPath = "C:DevopsDynamicsPowerPage"
$tempPath = "C:DevopsDynamicsPowerPagetemppowerpages-download"
$modelVersion = 2
$environment = "https://xxxxxxxxxxxxxxxxxxxx.crm4.dynamics.com/"
# Crear carpeta temporal limpia
if (Test-Path $tempPath) { Remove-Item $tempPath -Recurse -Force }
New-Item -ItemType Directory -Path $tempPath | Out-Null
# Descargar usando pac
pac powerpages download `
--path "$tempPath" `
--webSiteId $websiteId `
--modelVersion $modelVersion `
--environment $environment `
-o `
-xe mspp_columnpermission# Función para comparar dos archivos por contenido normalizado
function Compare-FilesByContent {
param(
[string]$file1,
[string]$file2
)
if (-not (Test-Path $file2)) { return $true }
try {
$content1 = Get-Content -Path $file1 -Raw | Out-String
$content2 = Get-Content -Path $file2 -Raw | Out-String
# Normalizar: quitar espacios finales, unificar saltos de línea, quitar BOM
$normalize = {
param($text)
$text -replace 's+$','' -replace "`r`n|`n|`r", "`n" -replace "`uFEFF", ''
}
$normalized1 = & $normalize $content1
$normalized2 = & $normalize $content2
return $normalized1 -ne $normalized2
} catch {
return $true # En caso de error, asumir que son distintos
}
}# Procesar archivos descargados
Get-ChildItem -Path $tempPath -Recurse -File | ForEach-Object {
$relativePath = $_.FullName.Substring($tempPath.Length)
$destPath = Join-Path $targetPath $relativePath
$shouldCopy = $false
if (-not (Test-Path $destPath)) {
$shouldCopy = $true
Write-Host "Nuevo archivo: $relativePath"
}
elseif (Compare-FilesByContent -file1 $_.FullName -file2 $destPath) {
$shouldCopy = $true
Write-Host "Archivo modificado: $relativePath"
} else {
Write-Host "Sin cambios: $relativePath"
}
if ($shouldCopy) {
$destDir = Split-Path $destPath -Parent
if (-not (Test-Path $destDir)) {
New-Item -ItemType Directory -Path $destDir -Force | Out-Null
}
Copy-Item -Path $_.FullName -Destination $destPath -Force
}
}
# Limpiar carpeta temporal
Remove-Item $tempPath -Recurse -Force
Mi compañero Jose Antonio Verdejo Cruz y yo tenemos más tranquilidad a partir de ahora 😉
Contenido compartido por: Ricardo Manzanares en LinkedIn
