3

サブモジュールとして他のリポジトリ (「コンポーネント」) を使用するいくつかの git リポジトリ (プロジェクト) があります。

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コマンドのみを使用して、より良い解決策を知っていますか?

私の問題を (部分的に) 解決するアプリケーション/プロジェクト/ライブラリを知っていますか?

4

1 に答える 1

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 サブモジュール名

基本的に、私は git ls-tree コマンドを利用しています。スーパーモジュールを使用している場合は、git ls-tree HEAD | を実行できます。grep "submodulename" これにより、サブモジュールのコミットが得られます。

よりスマートな方法があるかもしれませんが、これは問題を処理します:)

乾杯

于 2012-11-27T08:32:08.043 に答える