Как я могу получить хэши всех файлов, измененных в коммите? - PullRequest
1 голос
/ 14 октября 2019

Мне нужно получить список всех файлов, измененных в коммите - и их хешей - для сравнения со списком тех же файлов, предоставленных нашей базовой службой проверки. Я вижу множество способов получить список файлов , но ни один из них также не содержит список хэшей. index строк?

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Оказывается, что флаг --raw для git-show предоставляет эту информацию в формате, который легче анализировать, чем вывод diff. Эти строки включают также перемещенные и скопированные файлы.

Комбинируя это с флагом --no-abbrev, чтобы отобразить полные хэши, и используя флаг --format, чтобы скрыть информацию о коммите, мы получаем:

$ git show --raw --no-abbrev --format=
:100755 100755 0a88c4d759ce6b4f934812c85d616ff017f6caf4 633cf0a7281c549580e713edc4a0f4d0b91b3beb M      bin/quarterly-baseline
:100755 100755 e5a5a1f9437656ada68faf147393d887924bd6a7 3006514dad95f9a0249b97d984f0167c0837b61b M      bin/weekly-report
:100644 100644 82df0c621dc4f3fc98d6d4da518444d0ef3cdd9d 536eb5ad49a407660298dcf5204e3dc7ecb9aab8 M      docs/pages/api.rst
:100644 100644 267b4e017c77928e6f165095ee40043df8689da5 1d27b3084ec760870f79f434347cd2cb004dafe4 M      index.js
:100644 100644 03555ccf3978be14462b8c06a1790c9094ebbe42 846a85a5bbcf36c694d1ec244a56acd30f4494b2 R057   test/get-web-build-times-test.js        test/get-build-times-test.js
:100644 100644 d3f203c3e6d9c25df73e37ab0f3843f4c7687b1d e3c7eee94bbe379979c0c355cba86764a3f6caa9 R075   test/request-web-dev-box-stats-test.js  test/request-dev-box-stats-test.js

Каждая строка представляет измененный выходной файл, и хэши и имена файлов могут быть извлечены с помощью простого регулярного выражения: /:\d+ \d+ \w+ (\w+) .+ (\S+)/.

1 голос
/ 15 октября 2019

Приведенный ниже код анализирует выходные данные git diff-tree для коммитов без слияния, чтобы показать хэш, статус (изменен, добавлен, удален и т. Д.) Для каждого файла, измененного в коммите.

Например, в истории Git show-hashes 08da6496b6134 выводит

Documentation/RelNotes/2.24.0.txt M bda29d224a4f75b7497be901bd269f69d99de508

Направления для его расширения включают поддержку фиксации слияния и обнаружение перемещения или переименования.

#! /usr/bin/env perl

use strict;
use warnings;
no  warnings 'exec';

my $treeish = @ARGV ? shift : "HEAD";

my $sha1 = qr/[0-9a-f]{40}/;
my $mode = qr/[0-9]{6}/;
my $file_change = qr/
  ^ :
  $mode    # mode for src; 000000 if creation or unmerged
  [ ]
  $mode    # mode for dst; 000000 if deletion or unmerged
  [ ]
  ($sha1)  # sha1 for src; 0{40} if creation or unmerged
  [ ]
  ($sha1)  # sha1 for dst; 0{40} if creation, unmerged, or "look at work tree"
  [ ]
  ([ACDMRTUX])([0-9]*)
  $
/x;

my @cmd = (qw/ git diff-tree --raw -r -z /, $treeish);
open my $fh, "-|", @cmd
  or die "$0: failed to start @cmd";

$/ = "\0";

my $commit = <$fh>;
die "$0: merge commits not supported" unless defined $commit;
chomp $commit;
die "$0: expected commit SHA1"        unless $commit =~ /^$sha1$/;

while (<$fh>) {
  chomp;

  die "$0: unexpected [$_]"
    unless my($src,$dst,$status,$score) = /$file_change/;

  chomp(my $srcpath = <$fh> || "");
  die "$0: commit=$commit, dst=$dst: missing path" if $srcpath eq "";

  print "$srcpath $status $dst\n";
}

close $fh or die "$0: @cmd failed";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...