列出使用特定子模块的存储库

时间:2012-09-07 08:06:40

标签: git git-submodules

我有几个git存储库(项目),它们使用其他存储库(“components”)作为子模块:

Project 1
 - Component A
 - Component B
Project 2
 - Component B
 - Component C
Project 3
 - Component A
 - Component B

所有存储库都在同一台服务器上并排:

 - Project 1
 - Project 2
 - Project 3
 - Component A
 - Component B
 - Component C

我想找出使用​​组件B的项目。更具体地说:在哪个项目中使用了组件B的特定提交 - 或其后代。

我的方法:创建一个存储其提交哈希值的所有子模块的数据库。然后遍历特定提交的所有父项,并查看它们是否在数据库中。

您是否知道更好的解决方案,可能只使用git命令?

您是否知道(部分)解决了我的问题的应用程序/项目/库?

1 个答案:

答案 0 :(得分:0)

嗨,我今天为同事制作了一个小脚本 那想知道超模块中所有sha1中使用了给定子模块的哪个“版本”。

#!/bin/perl

use strict;
use warnings;

my $command = "";
my $submodule = $ARGV[0];
my $submodule_sha = "";
my @commits = ();
my %commit_hash = ();
my $commit = "";
my $key = "";
my $value = "";
$command="git log --since=\"1 week ago\" --format=format:%H";
@commits=`$command`;
foreach $commit (@commits)
{
    #cleaning the $commit
    $commit =~ s/\s+$//;
    $commit =~ s/^\s+//;
    $command="git ls-tree $commit \| grep $submodule \|  cut -d\" \" -f3 |cut -f1";
    print $command . "\n";
    $submodule_sha=`$command`;
    $commit_hash{$commit} = $submodule_sha;
}    

while (($key, $value) = each(%commit_hash)){
    print $key.", ".$value."\n";
}

像这样执行

你应该在超级模块中

./ scriptname.pl submodulename

基本上我只是利用了git ls-tree命令 如果你在超模块中,你可以做到     git ls-tree HEAD | grep“submodulename” 这将为您提供子模块的提交。

可能有一种更聪明的方法,但这可以解决问题:)

干杯