记一次使用bat批处理命令来完成Git批量操作的辛酸历程

背景:

由于项目工程的不断增多,在面临一些涉及到很多工程的需求的时候,难免要不断的去创建、切换、提交、合并、更新分支;

而在项目多的情况下,完成一系列的操作会耗费不少的时间,搞不好半天时间就悄悄过去了。
虽然Git在管理代码方面很不错的优势,但就分支的操作而言却失去了一些灵活性,不能够同时对多个分支进行切换,从而导致了工作效率的下降,
所以,在受够了这种来回切分支的痛苦之后,突然灵光一现,是否可以写一个工具,来达到批量操作的目的。
由于考虑到做界面交互会浪费不少的时间,而且还有可能存在开发语言环境的问题存在。正当自己在考虑怎么做的时候,突然想到TortoiseGit执行
更新、提交、创建、合并的交互界面里面第一行就是一些git相关的执行命令,那么有没有一种方法可以让自己快速的调用类似的命令来达到目的呢。在
经过一段折腾后,发现windows的批处理命令是可以这样调用的,所以就开始通过bat命令来达成目的的想法。

Bat命令手册:

首先是bat中怎么执行git命令

配置

需要将GitHome/cmd目录配置到环境变量path中,或者在bat中临时设置,如:set path=%path%;C:\Program Files\Git\cmd

git命令在bat中的调用:

git pull 更新
git branch !branch! 切换分支,!branch!是分支名称,包含在!中的branch是存储分支名称的变量
git checkout !branch! 拉取分支代码
git merge --no-ff --no-commit remotes/origin/!branch! 合并远程分支“remotes/origin/!branch!”到当前分支

了解怎么调用git的命令后,接下来就是要解决批量处理的问题

需要遍历当前路径中的文件夹

需要筛选出包含有.git的文件夹

筛选结果文件夹编号,并一一对应

用数组记录下每个文件夹的编号、名称、执行次数(默认为0,该记录是为了防止重复输入同一个编号)

具体代码如下:

::遍历当前目录下的包含.git的文件夹名称,记录文件夹总数
set /a totoalProjects=0
for /d %%i in (*) do (
	if not %%i==[Filter] (
		if exist "%cd%\%%i\.git\" (
			set projectIndex=!totoalProjects!
			set projectName=%%i
			set /a totoalProjects+=1
			echo !totoalProjects!: !projectName!
			::添加数组,包含:编号、名称、次数(避免重复操作)
			set Obj[!projectIndex!].num=!totoalProjects!
			set Obj[!projectIndex!].name=!projectName!
			set Obj[!projectIndex!].count=0
		)
	)
)

结果:
1:work
2:work1
3: work2
。。。。

根据以上遍历的结果,提示用户选择需要执行批量操作的文件夹编号:(/p 表示接受命令行工具传入的参数)

	::标记,当跟goto一起使用时,命令就会回到当前位置开始执行
	:break 
	::接受传入参数:需要操作的工程名称编号
	set /p projectNums=输入需要创建分支的工程名称的编号(逗号或者空格隔开):

提示用户输入操作的分支号:

	::接受传入参数:操作的分支号
	set /p branchName=输入需求号或者完整的分支名称:

逻辑判断用户输入的参数是否有误,如果错误就退出 重新输入:

	::判断输入的工程编号是否符合要求
	set /a index=0
	::将最终执行的工程拼接成字符串
	set /a currentProjectsStr=0
	for %%i in (%projectNums%) do (
		::判断输入的工程编号是否在指定的范围内,超出指定范围则提示错误
		if %%i LSS 1 (
			echo 输入工程编号错误...
			goto break
		) else (
			::不能超过最大工程编号
			if %%i GTR %totoalProjects% (
				echo 输入工程编号错误...
				goto break
			) else (
				set /a index=%%i-1
				set /a projectName=0
				::找到指定下标的数组,判断是否输入了重复的工程编号
				for /f "usebackq delims==. tokens=1-3" %%I in (`set Obj[!index!]`) do (
					::判断数组中的count属性是否为0,如果为0表示没有出现重复,否则表示编号重复,直接退出
					if %%J==count (
						if not %%K==0 (
							echo 输入工程编号重复...  
							goto break
						)
					) else if %%J==name (set projectName=%%K)
					
				)
				::将为1的结果设置的到数组的count属性,表示该编号已经解析过,用于后面判断是否出现编号重复
				set Obj[!index!].count=1
				::将会进行本次操作的工程拼接成字符串
				if !currentProjectsStr! EQU 0 ( 
					set currentProjectsStr=!projectName!
				) else ( 
					set currentProjectsStr=!currentProjectsStr!,!projectName!
				)
			)
		)
	)

当输入参数通过校验后就可以开始执行git命令:

	::遍历工程,完成分支切换和更新操作
	for %%i in (%currentProjectsStr%) do (
		if exist "%cd%\%%i\.git\" (
			if !branchType!==1 (set branch=%%i_!branchName!) else (set branch=!branchName!)
			echo git %%i create and switch branch !branch!...
			@cd %cd%\%%i && @git branch !branch! && @git checkout !branch!
			echo ********************************分支创建并切换完成****************************************
		)
	)

以上是整个bat的逻辑,在完成以上逻辑后,进行了测试,发现确实可用,自己也感到一股成就感,终于可以摆脱烦人的分支切换了;
但是上面的只是一个创建分支的操作,那么合并、切换、更新操作也是类似的逻辑,那么就会导致出现多个bat文件。如果用户有多个
工作空间,那么就意味着每个工作空间就会添加相同的bat文件,从设计上来讲,依赖性太强,同一个文件没有被重复利用。
所以有没有什么办法可以让这些批量工具向安装的软件一样,只需要在一处安装,任何地方都可以使用呢?有的。
所以为了提高复用性和体验度,这里我参考了Git,安装成功后将git的快捷调用添加到注册表,从而可以在鼠标右键点击空白处时出现在菜单中,
一想到这个想法,自己就迫不及待的去查找怎么往注册表里面添加一级菜单和二级菜单,经过不断的查资料,参考他人的经验,终于完成了属于自己菜单,

完整的代码如下:
@echo off

echo 开始注册信息...
::"批量切换分支并更新;批量创建并切换分支;批量更新所有分支;批量合并分支"
REG ADD "HKEY_CLASSES_ROOT\Directory\Background\shell\Git Batch Tool" /v subCommands /t REG_SZ /d "git.switch;git.create;git.update;git.merge" 
::添加子菜单:批量切换分支并更新
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.switch" /d "batch switch update"
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.switch\command" /d "cmd.exe /c \"%cd%\tool\git_switch_update.bat\""
::添加子菜单:批量创建并切换分支
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.create" /d "batch create switch | no commit"
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.create\command" /d "cmd.exe /c \"%cd%\tool\git_create_switch.bat\""
::添加子菜单:批量更新所有分支
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.update" /d "batch update all"
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.update\command" /d "cmd.exe /c \"%cd%\tool\git_update.bat\""
::添加子菜单:批量合并分支
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.merge" /d "batch merge | no commit"
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\git.merge\command" /d "cmd.exe /c \"%cd%\tool\git_merge.bat\""
echo 结束注册信息...

pause
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值