首页 > 技术文章 > 批处理 更新 svn git hg

marklove 2018-10-08 19:15 原文

@echo off
Setlocal enabledelayedexpansion
::CODER BY Administrator POWERD BY iBAT 1.6
::设置svn默认安装位置以及需要调用的应用程序
set workPath=C:\Program Files\TortoiseSVN\bin
set exeName=TortoiseProc.exe
echo Svn程序路径 C:\Program Files\TortoiseSVN\bin
::需要用户判断自己当前电脑svn的客户端是否也在这个目录下边,如果没有,使用用户录入的目录
set /p input=Svn程序路径是否正确 (Y or N):
if /i "%input%"=="Y" goto Y
if /i "%input%"=="N" goto N
:N
::用户录入正确的目录后,跳转到处理过程
set /p workPath=Svn安装目录=
goto Y
:Y
echo 数据处理中
::使用for循环从 dir 获取到字符串中获取文件夹名字
:: dir /ad-s/b 表示只取目录,并且不是系统文件夹,使用空格模式显示
for /f "delims=" %%i in ('"dir /ad-s/b "') do (
echo 正在查询文件【%%i】是否包含svn信息
::判断是否是svn文件夹
if exist "%~dp0%%i\.svn\" (
echo 正在更新项目 %%i
::调用更新命令
"%workPath%\%exeName%" /command:update /path:%%i /notempfile /closeonend:1)
)
echo 更新完成
pause
View Code
先上代码,如果你不了解bat,可以先复制下来,然后再去学习。



@echo off           //这句是不在cmd显示下面的命令,加个@是不显示自身的命令

for /f %%i in (proall.txt) do (         
echo 更新 %%i
TortoiseProc.exe /command:update  /path:D:\work\%%i /closeonend:2
echo 完成%%i 更新
echo.
)

exit12345678910

 
还有那个proall.txt,其实没什么,就是你要更新的项目,或者项目下的某一个文件夹



项目1
项目2 
项目3
项目4\排期表
项目4\文档
项目8
1234567

 
接下来解释一下: 
1、for /f %%i in (*) do()


这句意思是使用for循环来获取项目名,然后执行do里面的命令,for /f是用来读取文本的命令,文本的每一行表示一个元素,空行就跳过
其次%%i表示一个临时的i,表示proall.txt里面的某一个项目名称,而且是局部变量
上面的是在proall.txt里面读取要更新的项目名,如果项目多了,只要修改proall.txt就可以了,当然你不嫌麻烦也可以用“数组”,写在bat里面。


2、echo 更新%%i


只是加个提示,会提示更新项目1、更新项目2


3、 TortoiseProc.exe /command:update  /path:D:\work\%%i /closeonend:2 这一句是最主要的


TortoiseProc.exe表示执行TortoiseSVN的GUI程序
update,也就是执行更新项目的命令
接下来的path表示要更新哪个项目,我放在了D:\work目录下,会通过从proall.txt里面读取的来依次更新
closeonend:2表示更新时如果没发生错误和冲突则自动关闭对话框


4、echo 完成%%i 更新


也是加个提示,完成项目1 更新等等


5、echo.


如果你眼神还可以就会发现echo后面有个.,记住是紧挨着echo,没有空格,表示换行


6、exit


表示更新完的话自动关闭cmd命令窗口,当然如果你想看下更新了什么,可以改成pause

---------------------

本文来自 S_clifftop 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/S_clifftop/article/details/81079221?utm_source=copy 
View Code

 

 

 

# 批量更新多个Git库

 

:: gitpullall.bat
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS

SET MYGIT="D:\Program Files\Git\bin\git.exe"
SET MYHG="D:\Program Files\TortoiseHg\hg.exe"
FOR /D %%X IN (*) DO (
IF EXIST "%%X\.git\" (
CD /D "%%X"
ECHO ===== git pull %%X
%MYGIT% pull --recurse-submodules=yes --ff-only --all --progress
CD /D ..
) ELSE IF EXIST "%%X\.hg\" (
CD /D "%%X"
ECHO ===== hg pull %%X
%MYGIT% pull -u
CD /D ..
) ELSE ECHO ..... Skipped %%X
)

:bye
PAUSE
ENDLOCAL

# 打包一个或多个Git库

:: packdir.bat
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
 
SET MY7Z="D:\Program Files\7-Zip\7z.exe"
IF "%1" == "" (
  FOR /D %%X IN (*) DO (
    IF EXIST "%%X\.git\" (
      DEL "%%X.7z" 1>NUL 2>&1
      ECHO ===== Packing %%X\.git\ to %%X.7z
      %MY7Z% a -mx9 "%%X.7z" "%%X\.git\" 1>NUL
    ) ELSE ECHO ..... Skipped %%X
  )
) ELSE (
  DEL "%1.7z" 1>NUL 2>&1
  IF EXIST "%1\.git\" (
    ECHO ===== Packing %1\.git\ to %1.7z
    %MY7Z% a -mx9 "%1.7z" "%1\.git\" 1>NUL
  ) ELSE FOR /D %%X IN (*) DO (
    IF EXIST "%%X\.git\" (
      ECHO ===== Packing %%X\.git\ to %1.7z
      %MY7Z% a -mx9 "%1.7z" "%%X\.git\" 1>NUL
    ) ELSE ECHO ..... Skipped %%X
  )
)
 
:bye
PAUSE
ENDLOCAL
View Code

如果需要批量恢复所有子项目目录下的代码,运行gitcheckoutall.bat批处理文件:

:: gitcheckoutall.bat
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
 
SET MYGIT="D:\Program Files\Git\bin\git.exe"
FOR /D %%X IN (*) DO (
  IF EXIST "%%X\.git\" (
    CD /D "%%X"
    ECHO ===== git checkout %%X
    %MYGIT% checkout --recurse-submodules -f --
    CD /D ..
  ) ELSE ECHO ..... Skipped %%X
)
 
:bye
PAUSE
ENDLOCALSETLOCAL ENABLEEXTENSIONS
View Code
@echo off
Setlocal enabledelayedexpansion
SET MYGIT="C:\Program Files\SlikSvn\bin\svn.exe"
SET MYHG="D:\Program Files\TortoiseHg\hg.exe"
for /f "delims=" %%i in ('"dir /ad-s/b "') do (
echo 正在查询文件【%%i】是否包含svn信息
    IF EXIST "%%i\.svn\" (
        CD /D "%%i"
        echo 正在更新项目 %%i
        %MYGIT% up
        CD /D ..
    ) ELSE IF EXIST "%%i\.hg\" (
        CD /D "%%X"
        ECHO ===== hg pull %%i
        %MYGIT% pull -u
        CD /D ..
    ) ELSE ECHO ..... 不包含 %%i
)
echo 更新完成
pause

 

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
https://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches

推荐阅读