From 12420f26fa73904899af8bad82751e354ef1f0f3 Mon Sep 17 00:00:00 2001 From: "luk.lu" Date: Mon, 17 Oct 2022 11:40:49 +0800 Subject: [PATCH] git-pull-recursive --- git-pull-recursive.bat | 60 ++++++++++++++++++++++++++++++++++++++++++ git-pull-recursive.sh | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 git-pull-recursive.bat create mode 100644 git-pull-recursive.sh diff --git a/git-pull-recursive.bat b/git-pull-recursive.bat new file mode 100644 index 0000000..523cf37 --- /dev/null +++ b/git-pull-recursive.bat @@ -0,0 +1,60 @@ +@echo off + +@REM 首先清除可能残留的变量 +set FONPATH= + +@ if not "" == "%1" ( + set FONPATH=%1 +) else ( + if exist D:\faronear ( + set FONPATH=D:\faronear + ) else (if exist C:\faronear ( + set FONPATH=C:\faronear + ) else (if exist %HOMEDRIVE%%HOMEPATH%\faronear ( + set FONPATH=%HOMEDRIVE%%HOMEPATH%\faronear + ) else ( + echo === Enter [faronear root path] or leave blank for default to one of [.] + set /p FONPATH=">>> " + echo; + if "" == "%FONPATH%" ( + set FONPATH=. + ) + ))) +) + +if not exist "%FONPATH%" ( + echo *** [%FONPATH%] not exist! Exit now. *** + @ GOTO END +) + +pushd %FONPATH% +echo *** FONPATH = [%CD%] *** +echo; + +@REM for /d %%d in (*) do ( pushd %%d & ( for /d %%d in (*) do ( if exist %%d/.git pushd %%d & echo --- git pulling: %%d ... & git pull & popd ) ) & popd ) + +for /d /r %%r in (*.git) do ( + @REM windows的链接文件会造成路径错误,从而终止该循环,从而导致下一轮乃至所有循环的工作目录错误。因此要过滤掉 .vscode 这个符号链接目录。 + if not "%%r" == ".vscode" ( + @REM 如果同时使用了 GIT 和 云盘进行管理,每次 git pull 都会造成 .git 目录下某些文件变化,导致云盘不断自动同步。因此过滤掉云盘的目录不做更新。 + @REM echo %%o | findstr "=" >NUL && ( + @REM echo !!!!!!!! omitting [%FONPATH%\%%r] !!!!!!!! + @REM echo; + @REM ) || ( + if exist "%%r\.git" ( + pushd "%%r" + echo ---- git pulling [%FONPATH%\%%r] ---- + git pull --all + echo; + popd + ) + @REM ) + ) +) + +popd + +:END + +pause + diff --git a/git-pull-recursive.sh b/git-pull-recursive.sh new file mode 100644 index 0000000..9430b2a --- /dev/null +++ b/git-pull-recursive.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +if [ $1 ] +then + FONPATH=$1 +elif [ -d /faronear ] +then + FONPATH=/faronear +elif [ -d ~/faronear ] +then + FONPATH=~/faronear +elif [ -d /mnt/d/faronear ] +then + FONPATH=/mnt/d/faronear +else + echo "=== Enter [faronear root path] or leave blank for default to [.]" + read -p ">>> " FONPATH + echo "" + if [ ! $FONPATH ] + then + FONPATH=. + fi +fi + +if [ ! -d $FONPATH ] +then + echo "*** [$FONPATH] not exist! Exit now. ***" + exit +fi + +pushd $FONPATH +echo "*** FONPATH = [`pwd`] ***" +echo "" + +# for org in `ls -F | grep '/$' | grep -v '~'` ## 首先过滤出所有子目录,然后过滤出所有不含 ~ 的子目录。注意 for ??? in `ls ???` 是按照空行以及空格进行分割的,因此最后筛选出的目录名不能含有空格,否则就被分割成多个了。(for ??? in * 是分割成一个个目录名的,即使目录名含有空格。) +# ls -F | grep '/$' | grep -v '=' | while read org ## 换用这种方法,可以成功过滤出含有空格的完整目录名 +find . -mindepth 2 -maxdepth 3 -type d -name '?*.git' | grep -v 'node_modules' | while read repo +do + if [ -d "$repo/.git" ] + then + echo "---- git pulling [`pwd`/$repo] ----" + pushd "$repo" + git pull --all + echo "" + popd + fi +done +popd