1. 程式人生 > >批量更新和打包多個Git庫目錄

批量更新和打包多個Git庫目錄

# 批量更新多個Git庫

建立一個專門存放git庫專案的目錄,例如D:\git。
project專案的本地git庫目錄為D:\git\project\.git。
更新(git pull)D:\git目錄下的所有Git/Hg專案,在該目錄下執行gitpullall.bat批處理檔案:
:: 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

如果只需要fetch所有remote源,執行gitfetchall.bat批處理檔案:

:: gitfetchall.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 fetching %%X
        %MYGIT% fetch --all --recurse-submodules=yes -v --progress
        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

在D:\git目錄下帶引數project執行packdir.bat批處理檔案,則僅將project\.git\目錄打包為project.7z。

如果引數不是一個子目錄名,則將所有子專案的.git\目錄打為一個整包,包名為“引數.7z”。

如果不帶引數,則對當前目錄下所有專案的.git\目錄分別打包,包名為對應“子目錄名.7z”,包內儲存路徑"子目錄名\.git\"。

將打包檔案解壓後進入.git\上級專案目錄,執行"git checkout -f --"即可恢復該專案程式碼。

如果需要批量恢復所有子專案目錄下的程式碼,執行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