Hoy quiero compartir con vosotros un script batch que he creado para simplificar el proceso de actualización de repositorios Git. Este script es especialmente útil si trabajas con varios proyectos y deseas agilizar la tarea de actualizar y sincronizar con un repositorio remoto.
Aquí un resumen de su funcionalidad:
1. Validación de parámetros y dependencias, asegurándose de que Git esté instalado.
2. Configuración de variables, incluyendo rutas de directorios y configuraciones generales.
3. Configuración de banderas para determinar la acción a realizar (actualización o mostrar ayuda).
4. Selección del proyecto a actualizar o mostrar la ayuda según el parámetro proporcionado.
5. Mostrar la ayuda si se solicita mediante el parámetro -h.
6. Actualización del proyecto seleccionado:
a. Búsqueda del archivo ZIP más reciente en el directorio de proyectos.
b. Obtención de la fecha y hora actuales para crear un nuevo branch en Git.
c. Limpieza del directorio de destino, conservando el directorio .git.
d. Descompresión del último archivo ZIP en el directorio de destino.
e. Setup de Git y push de cambios al repositorio remoto.
Nota: Este script incluye tres opciones de ejemplo por defecto (-p1, -p2, -p3) para mostrar su funcionalidad. Estas opciones representan proyectos ficticios y repositorios de ejemplo. Estas opciones pueden ser personalizadas o expandidas según las necesidades específicas del usuario. Simplemente modifica las secciones correspondientes del script para reflejar tus proyectos y repositorios reales.
Nota: Este script sigue una aproximación de almacenamiento que guarda copias completas del proyecto con cada commit en lugar de almacenar cambios incrementales (diffs). La elección de almacenar copias completas puede resultar en un mayor uso de espacio en comparación con la técnica tradicional de Git, que almacena solo las diferencias entre commits. Sin embargo, esta estrategia se ha adoptado aquí para simplificar la gestión y garantizar que cada respaldo sea un punto coherente y completamente funcional en el tiempo.
Nota: La gestión de Git en este script puede no seguir las prácticas más ortodoxas, pero está diseñada para simplificar el proceso de realizar backups periódicos de proyectos en la nube. En lugar de utilizar ramas separadas para cada actualización, se utiliza la fecha y hora actual como parte del nombre de la rama, lo que puede no ser la convención típica de Git. La eliminación y recreación del directorio de destino puede ser considerada una aproximación inusual, pero se ha implementado para garantizar una limpieza completa antes de extraer el último respaldo.
En definitiva, este script es una solución práctica para aquellos que buscan una forma rápida y automatizada de mantener respaldos actualizados en un repositorio remoto, aunque puede no seguir las mejores prácticas recomendadas por la comunidad Git.
Código:
@echo off
setlocal enabledelayedexpansion
REM Batch Script for Git Project Update
REM Author: profinet
REM Date: 2023-11-20
REM Version: 0.1
REM Description:
REM This batch script is designed to automate the process of updating Git projects.
REM It includes functionality for handling multiple projects, cleaning the destination directory, extracting the latest backup, and pushing changes to the remote repository.
REM The script is intended to streamline the update process and reduce manual intervention.
REM Author's Note:
REM The script was created by profinet on the specified date. For any inquiries or suggestions, please contact the author.
REM Version History:
REM - Version 0.1 (2023-11-20): Initial release of the script.
REM This version includes basic functionality for updating Git projects and serves as the foundation for future enhancements.
REM Check for provided input
if "%~1"=="" (
echo No parameters provided. Exiting...
exit /b
)
set "validParams=-p1 -p2 -p3 -h"
if "!validParams:%~1=!" equ "%validParams%" (
echo Invalid parameter: %1
echo Valid parameters are: %validParams%
exit /b
)
REM Check for dependencies
set "gitFolder=%ProgramFiles%\Git"
if not exist "%gitFolder%" (
set "gitFolder=%ProgramFiles(x86)%\Git"
if not exist "%gitFolder%" (
echo Git is not installed in the default location. Exiting...
exit /b
)
)
REM Create environment variable to use git commands
set "PATH=%PATH%;%gitFolder%\cmd"
REM Set up general variables
set "latestFile="
set "projectDirFrom=C:\Path\To\Your\Projects"
set "projectDirTo=C:\Path\To\Your\Git\Repos"
REM Set up flags
set "updateProject=false"
set "showHelp=false"
REM Read which option was selected
if "%~1" == "-p1" (
set "updateProject=true"
set "projectFolder=Project1"
set "repo_uri=https://git.example.com/your_username/project1.git"
)
if "%~1" == "-p2" (
set "updateProject=true"
set "projectFolder=Project2"
set "repo_uri=https://git.example.com/your_username/project2.git"
)
if "%~1" == "-p3" (
set "updateProject=true"
set "projectFolder=Project3"
set "repo_uri=https://git.example.com/your_username/project3.git"
)
if "%~1" == "-h" set "showHelp=true"
REM Add as many options as needed
:showHelp
if "%showHelp%"=="true" (
echo Use of script:
echo %~nx0 -p1 Update Project1
echo %~nx0 -p2 Update Project2
echo %~nx0 -p3 Update Project3
echo %~nx0 -h Show help
exit /b
)
REM Look up the latest backups
if "%updateProject%"=="true" (
cd "%projectDirFrom%\%projectFolder%\"
for %%i in (*.zip) do (
set "currentFile=%%i"
if "!currentFile!" gtr "!latestFile!" (
set "latestFile=!currentFile!"
)
)
REM Get date and time to rename the new branch
set "current_date=!date:/=-!!time::=-!"
set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%
if "%updateProject%"=="true" (
cd /d "%projectDirTo%\%projectFolder%"
REM Delete all files (excluding .git) in the destination directory
for %%i in (*) do (
if /i not "%%i"=="%projectDirTo%\%projectFolder%\.git" (
del "%%i"
)
)
REM Delete all subdirectories (excluding .git) in the destination directory
for /d %%i in (*) do (
if /i not "%%i"=="%projectDirTo%\%projectFolder%\.git" (
rmdir /s /q "%%i"
)
)
REM Extract the latest zip file to the destination directory
powershell -command Expand-Archive -Path '%projectDirFrom%\%projectFolder%\!latestFile!' -DestinationPath '%projectDirTo%\%projectFolder%' -Force
REM Set up Git and push the changes
git remote add origin %repo_uri%
git checkout -b %dt%
cd %projectFolder%
git add --all
git commit -m "Update %dt%"
git push -u origin %dt%
)
)
echo.
pause > nul
endlocal