Git-фильтр с неправильной датой и SHA-1 (расширение ключевого слова)

Привет, я использую эти скрипты для расширения ключевых слов в git: https://github.com/turon/git-rcs-keywords/blob/master/.git_filters/rcs-keywords.smudge

Сценарий smudge выглядит следующим образом:

#!/usr/bin/perl
#
$path = shift;
$path =~ /.*\/(.*)/;
$filename = $1;

if (0 == length($filename)) {
$filename = $path;
}

# Need to grab filename and to use git log for this to be accurate.
$rev = `git log -- $path | head -n 3`;
$rev =~ /^Author:\s*(.*)\s*$/m;
$author = $1;
$author =~ /\s*(.*)\s*<.*/;
$name = $1;
$rev =~ /^Date:\s*(.*)\s*$/m;
$date = $1;
$rev =~ /^commit (.*)$/m;
$ident = $1;

while (<STDIN>) {
    s/\$Date[^\$]*\$/\$Date:   $date \$/;
    s/\$Author[^\$]*\$/\$Author: $author \$/;
    s/\$Id[^\$]*\$/\$Id: $filename | $date | $name \$/;
    s/\$File[^\$]*\$/\$File:   $filename \$/;
    s/\$Source[^\$]*\$/\$Source: $path \$/;
    s/\$Revision[^\$]*\$/\$Revision: $ident \$/;
} continue {
    print or die "-p destination: $!\n";
}

чистый скрипт, как это:

#!/usr/bin/perl -p
#
s/\$Id[^\$]*\$/\$Id\$/; 
s/\$Date[^\$]*\$/\$Date\$/;
s/\$Author[^\$]*\$/\$Author\$/; 
s/\$Source[^\$]*\$/\$Source\$/; 
s/\$File[^\$]*\$/\$File\$/; 
s/\$Revision[^\$]*\$/\$Revision\$/;

файл примера, где ключевые слова должны быть заменены:

/**
 * @file        hello.c
 * @author      @$Author$
 * @date    @$Date$
 * @version @$Revision$
 *
 * $Id$
 */

int main(int argc, char *argv[])
  printf("Hello, new world!");

Ключевые слова заменяются соответствующими данными. Однако эти данные всегда отражают коммит, с которого я переключаюсь. Не тот, который я проверяю.
В качестве примера у меня есть файл hello.c в ветке master и модифицированный hello.c в ветке test_master. Если я проверил мастер, а затем проверил test_master, ключевые слова в hello.c отражают дату и SHA-1 файла в ветке master, и наоборот (при повторной проверке мастера файл становится нечетким с SHA-1 и датой test_master). Похоже, что команда "git log" сценария smudge выполняется перед фактической проверкой и, следовательно, предоставляет информацию о коммите, с которого я переключаюсь. У кого-нибудь есть объяснение этому?
Я использую GIT 2.15 на Windows 7

Доктор чувак

0 ответов

Другие вопросы по тегам