如何从本地工作目录中删除所有未跟踪的子模块?

How to remove all untracked submodules from local working directory?

在我的项目中,我正在处理两个分支(开发和发布),每个分支都大量使用子模块。 Develop 分支使用的子模块数量大约是 Release 的两倍,因为它是我们测试想法的地方。

当我将分支从 Develop 切换到 Release 时,特定于 Develop 的子模块的目录保留在原处,因此它们变得无法跟踪。这让我有点困惑,因为我偶尔也需要在 Release 中添加或删除子模块,并且 git 状态消息变成一长串未跟踪的模块,其中一些我想使用,一些我不。

我想做的是,一旦我从开发切换到发布,就从我的项目中删除所有未跟踪的子模块,这样我就可以使用 "clean slate",(IE 中没有未跟踪的子模块我的工作目录)。

我找到了几种一次删除单个子模块的解决方案,例如这里:How do I remove a submodule?

然而,像这样的解决方案假设 git 子模块正在使用并被跟踪(实际上它们没有),而且当我一次移除它们时,也很麻烦我正在处理 15-20 个子模块。

我也尝试过管道 linux 命令,如下所示:

git ls-files --others --exclude-standard | rm -rf

但该命令似乎没有执行任何操作。我也尝试过将相同的方法与 git rm -rf 一起使用,但无济于事。

有谁知道是否可以轻松地从工作目录中删除所有未跟踪的 git 子模块?任何人都可以就此事分享的任何建议将不胜感激。谢谢!

根据评论部分中有用的人的一些建议,我确定没有明显的、简单的解决方案来解决这个问题。相反,我创建了一个 bash 脚本来为我完成这项工作。在这里,以防其他人遇到同样的问题:

#!/bin/bash

clear
git ls-files --others --directory --exclude-standard
echo
read -r -p "Are you sure you want to remove these untracked submodules? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
    git ls-files --others --directory --exclude-standard | while read line; do
    rm $line/.git &> /dev/null;
  done
  git clean -d  -f
fi

对于不太习惯 Bash 脚本的人的简单步骤:

第 1 步:将上述脚本复制到文件中并命名为 'cleanUSM'。将文件保存到 /usr/bin。如果您在保存或查找 /usr/bin 时遇到问题,只需将其保存到当前目录,然后使用 'sudo mv cleanUSM /usr/bin/cleanUSM' 将其获取到需要的位置。

第 2 步:在您的根目录中,运行 命令 'cleanUSM'

感谢所有贡献的人!