使用批处理为git hook建立软链接

一、问题来源与解决方案

在另一篇文章中使用Luacheck和git hook在git pre-commit时检查lua代码规范介绍了使用git hook在提交时做一些hook,比如unity meta文件上传检测,这个很多美术同学都容易漏掉;以及引入luacheck时需要一些环境变量和luacheck的配置等;

但是有几个麻烦的点:

  • 首先是配置较多比较繁琐,尤其是对非程序的同学不够友好
  • 再者,hook文件不能加入到版本控制中,包括luacheck的配置也不能在版控中,但是我们确实需要将其进行版本控制,否则文件内容同步则需要依赖人力;

这里使用批处理来完成自动化配置,主要思路如下:

  • 对于配置文件,使用软链接的方式,每次链接前检测是否已存在软链接,如果已经存在,则删除;
  • 对于环境变量,会首先检查环境变量的关键字,如luacheck,检查完以后,如果没有,则通过注册表命令进行添加;
@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

for %%d in (%~dp0.) do set Directory=%%~fd
set Directory = %Directory%
for %%d in (%~dp0..) do set ParentDirectory=%%~fd
set ParentDirectory = %ParentDirectory%
for %%d in (%~dp0../..) do set RootDirectory=%%~fd

REM echo %Directory%
REM echo %ParentDirectory%
REM echo %RootDirectory%

set linDir=\.git\hooks\pre-commit
set srcDir=\Tools\GitHook\hook\pre-commit

set linAbsoluteDir=%RootDirectory%%linDir%
set srcAbsoluteDir=%RootDirectory%%srcDir%

REM echo %linAbsoluteDir%
REM echo %srcAbsoluteDir%

Rem hook 软链接------------------------------------------------------------------------
del %linAbsoluteDir%
mklink %linAbsoluteDir% %srcAbsoluteDir%

set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set evname=BAT_HOME
set batpath=%~dp0luacheck
REM echo %ENV_PATH%

REM set ENV_PATH=%PATH%
REM set envpath=%ENV_PATH%;%batpath%
REM reg add "%regpath%" /v Path /d "%envpath%" /f

set str1="%PATH%"
set batpath=%~dp0luacheck;
set envpath=%PATH%%batpath%
set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Rem 环境变量检测和设置------------------------------------------------------------------------
if x%str1:luacheck=%==x%str1% (
    REM echo "%envpath%"
    echo no check!
    reg add "%regpath%" /v backupPath /d "%path%" /f
    reg add "%regpath%" /v path /d "%envpath%" /f
) else (
    echo luacheck env have been added!
)

set datapath = %LOCALAPPDATA%
REM echo %LOCALAPPDATA%

Rem 创建luacheck文件夹------------------------------------------------------------------------
md "%LOCALAPPDATA%\Luacheck"

set linCheckCfgDir=\Luacheck\.luacheckrc
set srcCheckCfgDir=\luacheck\.luacheckrc
set linCheckCfgAbsoluteDir=%LOCALAPPDATA%%linCheckCfgDir%
set srcCheckCfgAbsoluteDir=%Directory%%srcCheckCfgDir%
REM echo %linCheckCfgAbsoluteDir%
REM echo %srcCheckCfgAbsoluteDir%

Rem luacheck配置软链接------------------------------------------------------------------------
del %linCheckCfgAbsoluteDir%
mklink %linCheckCfgAbsoluteDir% %srcCheckCfgAbsoluteDir%

pause

二、批处理语法小结

set的=赋值,不能有空格;

要注意区分字符串和目录,字符串要加"";

注意变量名的引用需要加%%,否则就当成一个值来使用了;

if else的括号和代码之间要有空格;

删除软链接使用del命令;

Rem是注释命令;

echo on/off,外显命令;

管理员权限执行:%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

你可能感兴趣的:(工具,Lua)