我想出了一个 Perl 脚本来在删除子模块后清理 repo 配置。不幸的是,它仅在陈旧的子模块目录位于超级项目的根目录中时才有效。因为,猜猜看,在删除子模块的 git-link 和 .gitmodules 条目后,git 不会存储它在树中的位置。即使 repo 配置完全脏,清理删除所需的单个信息也不可用。值得为 git 维护者写信。目前我建议大家不要管子模块。
无论如何,这是脚本。在这之后git clean -xdf
工作。诚实。:-)
#!/usr/bin/perl
our %mods;
open MOD, ".gitmodules" or die $!;
while (<MOD>) {
if (/\[submodule "(.+)"\]/) {
$mods{$1} = 1;
}
}
close MOD;
rename ".git/config", ".git/config~" or die $!;
open BAK, ".git/config~";
unlink ".git/config~";
open CFG, ">.git/config";
our $print_on = 1;
while (<BAK>) {
if (/\[submodule "(.+)"\]/) {
$print_on = $mods{$1};
unlink "$1/.git" unless $print_on;
} elsif (/^\[/) {
$print_on = 1;
}
print CFG if $print_on;
}
close BAK;
close CFG;