我所尝试的
git submodule foreach git checkout main
git submodule foreach git add --all
git submodule foreach git diff-index --quiet HEAD || git commit -m "%CommitMessage%"
git submodule foreach git push
这将对所有子模块运行命令1,然后对所有子模块运行命令2,依此类推。
我想要什么
我希望只有一个foreach,并一次执行子模块的所有命令,然后继续执行下一个子模块。
提问
有没有办法让git submodule foreach
调用一个方法,或者以某种方式一次调用多个命令?
我想在Windows上的批处理脚本中执行此操作。
2条答案
按热度按时间w9apscun1#
假设一个类Unix环境,你可以用
git submodule foreach
运行一个shell脚本:gojuced72#
要使用 Windows 的**解决方案补充larsks' helpful Unix solution,请从 * 批处理文件 *(请参阅 PowerShell 的下一节):
git
支持传递 *shell命令 * 的其他情况一样,这些命令由Git Bash评估,即Windows上与git
捆绑在一起的Bash实现。因此,即使在Windows上也必须使用 Bash(POSIX兼容)shell语法。git submodule foreach
定义了以下(环境)变量来提供关于子模块的信息,您可以在shell命令中引用这些变量:$name
、$sm_path
、$displaypath
、$sha1
和$toplevel
;如上所述,由于必须在shell命令中使用 Bash 语法,您需要引用这些变量,如图所示(例如:作为$name
而不是批处理文件样式%name%
)git help submodule
。"..."
引号(cmd.exe
/批处理文件不支持多行引号字符串,并且程序只期望"
,而不是'
在其进程命令行上具有语法功能)。%CommitMessage%
批处理样式的变量引用被 * 预先 * 扩展为cmd.exe
,\"...\"
用于正确地转义扩展结果周围的嵌入式"..."
。*警告:如果
%CommitMessage%
的值包含cmd.exe
元字符,如|
和&
,则命令将 break,因为cmd.exe
将这些视为 unquoted,这是由于不理解周围的\"
是 * 转义 * 双引号;正如您所报告的,set "CommitMessage=%info1% | %info2% | %info3%"
在您的案例中导致了一个问题,有两个解决方案选项:^
-转义元字符;例如:!
字符被消除):setlocal enableDelayedExpansion
。!...!
而不是%...%
来引用变量,即!CommitMessage!
&&
链接命令,以便后续命令仅在前一个命令成功时执行。PowerShell透视图(在Windows和类Unix平台上):
重要:
"
字符。在将参数传递给外部程序(如git
)时显式地进行\
-转义,幸运的是,PowerShell(Core)7.3+中不再需要此参数$
作为变量引用,因此您必须```-转义任何您想要保留的$
字符,作为git
执行的(POSIX兼容)shell命令的一部分;例如,为了传递逐字的$name
以引用子模块名称,使用``$name`"..."
引号时才有必要,即 expandable 字符串,而这仅在需要PowerShell的 * 字符串插值 *(扩展)时才有必要,例如如上所示嵌入 *PowerShell变量 *$CommitMessage
的值。'...'
引号,即一个 verbatim 字符串('...'
),在这种情况下传递$
字符。不需要逃跑。/bin/sh
被显式调用。sh
进程,但很方便,因为-e
选项(当命令失败时中止)允许单独指定命令,而不必将它们与&&
链接在一起