grep을 사용하여 Git 프로젝트에 소요된 시간 추정

grep을 사용하여 Git 프로젝트에 소요된 시간 추정

Git 로그를 고려해보세요:

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 11 22:41:21 2016 +0200

    Final foobar version

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 11 19:11:51 2016 +0200

    Working foobars

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 11 10:31:37 2016 +0200

    Broken foobars

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 10 21:47:22 2016 +0200

    Added foobars

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 10 11:54:12 2016 +0200

    Preparation for foobars

매일 각 커밋 메시지의 첫 번째 시간과 마지막 시간을 얻은 다음 계산을 수행하고 소요된 총 시간을 추정하려면 어떻게 해야 합니까?이 같은:

Date:   Mon Jan 11 22:41:21 2016 +0200
Date:   Mon Jan 11 10:31:37 2016 +0200
TOTAL A:           12:09:44

Date:   Mon Jan 10 21:47:22 2016 +0200
Date:   Mon Jan 10 11:54:12 2016 +0200
TOTAL B:           09:53:10

TOTAL: 22:02:54

이 질문의 목적에 따라 모든 커밋은 동일한 사람이 수행한다고 가정할 수 있습니다. 하루에 커밋할 수 있는 수에는 제한이 없으며, 다양한 월 또는 연도 경계에 걸쳐 있는 날짜 수에는 제한이 없습니다.

답변1

다음 Perl 코드는 내가 생각하는 당신이 원하는 것에 매우 가깝습니다. Perl을 처음 사용하는 경우 DateTime::Format::StrptimeCPAN에서 이 모듈을 설치 해야 합니다 cpan install DateTime::Format::Strptime....

그런 다음 git log를 파일로 출력합니다 git log > git.log.

그 후, 다음 코드를 파일에 붙여넣고 로그 파일을 동일한 디렉터리에 배치한 후 실행합니다.

이것은 내 코드가 가장 예쁘거나 효율적인 코드는 아니지만 뭔가를 조합하는 데 몇 분 밖에 걸리지 않았습니다.

#!/usr/bin/perl
use warnings;
use strict;

use DateTime::Format::Strptime;

my $log = 'git.log';

open my $fh, '<', $log or die $!;

my %dates;
my @order;

while (<$fh>){
    if (/Date:\s+(.*?)(\d{2}:.*)/){
        push @order, $1 if ! $dates{$1};
        push @{ $dates{$1} }, "$1$2";
    }
}

my $letter = 'A';
my $total_time = DateTime::Duration->new;

for my $day (@order){

    my $start = $dates{$day}->[0];
    my $end   = $dates{$day}->[-1];

    my $parser = DateTime::Format::Strptime->new(
        pattern  => '%a %b %d %H:%M:%S %Y %z',
        on_error => 'croak',
    );

    my $dt1 = $parser->parse_datetime($start);
    my $dt2 = $parser->parse_datetime($end);

    my $total = $dt1 - $dt2;
    $total_time = $total_time + $total;

    print "$start\n$end\n";

    print "Total $letter:\t";
    print join ':', ($total->hours, $total->minutes, $total->seconds);
    print "\n\n";

    $letter++;
}

print "Total time overall: ";
print join ':', ($total_time->hours, $total_time->minutes, $total_time->seconds);
print "\n";

관련 정보