1

对于带有子模块的项目的 CI 构建,我想确保工作树与中央存储库中提交的状态完全匹配。

在获取并检查超级项目的修订版后,我执行以下步骤来更新子模块:

git submodule foreach 'git reset --hard && git clean -xdf'
git submodule update --init

这似乎适用于所有情况,除非在中央存储库中删除了子模块。在这种情况下,作业工作副本仍然包含已删除的子模块。

此外,git clean -xdf超级项目上的 a 似乎并没有触及陈旧的子模块。

那么,是否可以自动检测过时的本地子模块并将它们删除?

4

2 回答 2

2

问题是您的 repo 配置仍然完全被陈旧的子模块数据污染。我设法git clean -xdf通过首先清理 repo 配置来开始工作。

我从源代码使用 git 1.8.1.3,但子模块的删除仍然是一个令人头疼的问题。我完全不知道为什么任何子模块信息都存储在 repo 配置中。我们完全停止使用它们,并改为子树合并。

假设陈旧的子模块在目录中foo

如果子模块仍列在您的.git/config文件中,但已从.gitmodules. 你现在需要做4件事:

  • 从中删除子模块 foo 数据.git/config
  • 删除陈旧的子模块的 gitfilerm foo/.git
  • 删除过时的子模块的 reporm -rf .git/modules/foo
  • 立即清洁:git clean -xdf
于 2013-08-13T16:02:04.313 回答
0

我想出了一个 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;                                     
于 2013-08-18T21:52:19.967 回答