Bat循环处理git

/ Windows / 没有评论 / 1318浏览

Bat循环处理git

我要对公司的git服务器做一个代码备份,那么我需要定义1个备份目录,在这个目录中包含了很多git项目也有未嵌入的git项目,,目录层级不等,目录数量未知。于是定义了如下几个bat文件用于处理git同步。

查看所有远程地址

gitremote.bat

@ECHO OFF
SET INIT_PATH=%~dp0
CALL :pull %INIT_PATH%
pause
ECHO ON
@goto:eof

:pull
CD "%1"
FOR /D %%s IN (*) DO ( 
	IF EXIST %1\%%s\.git ( 
		echo %1\%%s
		CD "%1\%%s"
		git remote -v
		CD "%1"
	) ELSE IF EXIST %1\%%s\.idea (
		echo %1\%%s\.idea
	) ELSE IF EXIST %1\%%s (
		CALL :pull %1\%%s
	) ELSE (
		goto:eof
	)
)
CD "%1"
goto:eof

从远程拉取代码地址

gitpull.bat

@ECHO OFF
SET INIT_PATH=%~dp0
CALL :pull %INIT_PATH%
pause
ECHO ON
@goto:eof

:pull
CD "%1"
FOR /D %%s IN (*) DO ( 
	IF EXIST %1\%%s\.git ( 
		CD "%1\%%s"
		echo %1\%%s
		git fetch --all
		git pull --all
		CD "%1"
	) ELSE IF EXIST %1\%%s\.idea (
		echo %1\%%s\.idea
	) ELSE IF EXIST %1\%%s (
		CALL :pull %1\%%s
	) ELSE (
		goto:eof
	)
)
CD "%1"
goto:eof

提交到远程库

gitpush.bat

@ECHO OFF
SET INIT_PATH=%~dp0
CALL :pull %INIT_PATH%
pause
ECHO ON
@goto:eof

:pull
CD "%1"
FOR /D %%s IN (*) DO ( 
	IF EXIST %1\%%s\.git ( 
		CD "%1\%%s"
		echo %1\%%s
		git fetch --all
		git pull --all
		git add .
		git commit -m "auto commit"
		git push
		CD "%1"
	) ELSE IF EXIST %1\%%s\.idea (
		echo %1\%%s\.idea
	) ELSE IF EXIST %1\%%s (
		CALL :pull %1\%%s
	) ELSE (
		goto:eof
	)
)
CD "%1"
goto:eof

指令详情

注意不要把本文件执行保存,包含中文可能会导致不能执行。

:: ECHO OFF设置不显示指令,@符号表明不显示当前指令
@ECHO OFF
:: 设置INIT_PATH变量为当前目录
SET INIT_PATH=%~dp0
:: 调用 :pull 函数,并传入参数 INIT_PATH
CALL :pull %INIT_PATH%
:: 暂停显示,用于双击bat时显示结果
pause
:: 恢复显示指令
ECHO ON
:: 设置程序停止执行
@goto:eof

:: 定义:pull函数
:pull
:: 进入到参数1的目录
CD "%1"
:: 循环当前目录的子目录,子目录名称为 %%s , /D 代表循环当前目录的子目录
FOR /D %%s IN (*) DO ( 
	IF EXIST %1\%%s\.git ( 
   		:: 判断是否存在 .git 目录,存在则执行 git相关指令
	    :: 进入代码目录
		CD "%1\%%s"
		:: 显示代码目录
		echo %1\%%s
		:: 获取git所有远程分支版本
		git fetch --all
		:: 拉取git所有远程分支
		git pull --all
		:: 添加修改文件到当前分支
		git add .
		:: 提交当前分支
		git commit -m "auto commit"
		:: 提交到远程目录
		git push
		:: 进入到当前目录的父目录
		CD "%1"
	) ELSE IF EXIST %1\%%s\.idea (
		:: 判断是否存在.idea目录,存在则不进行任何处理,仅仅打印当前目录
		echo %1\%%s\.idea
	) ELSE IF EXIST %1\%%s (
		:: 判断是否存在目录,存在目录则进行递归循环处理
		CALL :pull %1\%%s
	) ELSE (
		:: 结束执行,防止死循环
		goto:eof
	)
)
:: 进入父目录
CD "%1"
:: 结束函数执行
goto:eof