Skip to content

Herramientas


Este script de PowerShell identifica y elimina ramas remotas en Git con más de 4 meses de inactividad, configurado mediante la variable $monthsOld = 4. Calcula una fecha umbral restando esos meses a la fecha actual, obtiene todas las ramas remotas y filtra las que son anteriores a esa fecha. Luego, muestra las ramas antiguas y pregunta si se desean eliminar. Si se confirma, elimina tanto la rama remota (git push --delete origin) como la rama local (git branch -d). Si no hay ramas antiguas, informa al usuario.

Terminal window
# Define el numero de meses antiguos para la comparacion
$monthsOld = 4
# Obtiene la fecha actual y resta el numero de meses especificado
$thresholdDate = (Get-Date).AddMonths(-$monthsOld)
# Obtiene todas las ramas remotas con la ultima fecha de commit en formato legible
$branches = git for-each-ref --sort=-committerdate refs/remotes/ --format="%(refname:short) %(committerdate:iso8601)"
# Convertir la salida de git en objetos de PowerShell para facilitar el manejo
$branchObjects = $branches | ForEach-Object {
$parts = $_ -split ' ', 2
[PSCustomObject]@{
BranchName = ($parts[0] -replace '^origin/', '') # Elimina el prefijo 'origin/'
LastCommitDate = [DateTime]$parts[1]
}
}
# Filtrar y mostrar las ramas que son mas antiguas que la fecha umbral
$oldBranches = $branchObjects | Where-Object { $_.LastCommitDate -lt $thresholdDate }
# Imprimir las ramas en un formato tabular
if ($oldBranches.Count -gt 0) {
Write-Output "Ramas remotas mas antiguas que $monthsOld meses:"
$format = @{Expression={$_.BranchName};Label="Nombre de la rama";Width=50},
@{Expression={$_.LastCommitDate.ToString('yyyy-MM-dd')};Label="Ultimo Commit";Width=20}
$oldBranches | Format-Table $format
# Preguntar si se desea eliminar cada rama
$oldBranches | ForEach-Object {
$branchName = $_.BranchName
$lastCommitDate = $_.LastCommitDate.ToString('yyyy-MM-dd')
$response = Read-Host "Desea eliminar la rama '$branchName' con ultimo commit el $lastCommitDate ? (s/n)"
if ($response -eq 's') {
# Eliminar la rama en remoto
Write-Output "Ejecutando comando para eliminar rama remota"
git push --delete origin $branchName
Write-Output "Rama remota '$branchName' eliminada."
# Eliminar la rama en local
Write-Output "Ejecutando comando para eliminar rama local"
git branch -d $branchName
Write-Output "Rama local '$branchName' eliminada."
} else {
Write-Output "Rama '$branchName' no eliminada."
}
Write-Output " "
Write-Output " "
}
} else {
Write-Output "No hay ramas remotas con mas de $monthsOld meses de antiguedad."
}