使用“git submodule foreach”可以跳过子模块列表吗?

xeufq47z  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(120)

假设我有10个子模块:

module/1
module/2
module/3
module/4
module/5
module/6
module/7
module/8
module/9
module/10

其中module/是顶级repo。
我想做git submodule foreach 'git status',但我不想对子模块4,6和7做。
有没有办法做到这一点,somthing like:
git submodule foreach --exclude="4 6 7" 'git status'
我尝试在命令块中使用

git submodule foreach '
    if [[ $list_of_ignores =~ *"$displayname"* ]] ; then echo ignore; fi
'

更新-删除了意外出现的--exclude="4 6 7"

但是我得到了一个错误,说eval [[: not found--我假设这是因为它使用了/bin/sh而不是/bin/bash?- 不确定...

icnyk63a

icnyk63a1#

正如文档所说,foreach执行shell命令

foreach [--recursive] <command>
    Evaluates an arbitrary shell command in each checked out submodule. The 
    command has access to the variables $name, $sm_path, $displaypath, $sha1
    and $toplevel

使用shell:

git submodule foreach 'case $name in 4|6|7) ;; *) git status ;; esac'

如果语法看起来很奇怪,可以查找bash的case语句的语法。上面的代码,如果写在一个带有换行符的脚本中,将是:

case $name in # $name is available to `submodule foreach`
    4|5|6)
     ;;
    *)     # default "catchall"
     git status 
    ;;
esac
baubqpgj

baubqpgj2#

这可能是一个糟糕的解决方案,但它适用于我的具体情况。
git submodule foreach --recursive只会迭代现有的文件夹(也是非递归的),所以我通常只删除文件夹以跳过**(首先确保所有内容都已提交/隐藏!))**.
因此,在以下子模块结构的情况下:

tree
.
├── 1
├── 2
│   ├── 3
│   └── 4
├── 5
│   ├── 6
│   │   ├── 7
│   └── 8
└── 9

如果我想在除了5和子模块之外的每个子模块上执行foo命令,我只需删除5文件夹:

rm -rf 5
git submodule --recursive foo             # 5, 6, 7, 8 won't be touched.
git submodule --update --init --recursive # Restore the removed folders.
ckx4rj1h

ckx4rj1h3#

code_fodderjthill的基础上(添加一个backlash有助于命令正常运行,添加--recursive标志也很好),下面的命令有助于排除不同的子模块,例如。4、5和6,并对每个嵌套的子模块运行git status

excludes='4|6|7' git submodule foreach --recursive "eval \"case \$name in \$excludes) ;; *) git status ;; esac\""

相关问题