Como recuperar a última data de modificação de todos os arquivos em um repositório git

50

Eu sei como recuperar a última data de modificação de um único arquivo em um repositório git:

git log -1 --format="%ad" -- path/to/file

Existe uma maneira simples e eficiente de fazer o mesmo para todos os arquivos atualmente presentes no repositório?

    
por Eric Bréchemier 22.06.2012 / 21:41

4 respostas

61

Uma resposta simples seria fazer uma iteração em cada arquivo e exibir seu horário de modificação, por exemplo:

git ls-tree -r --name-only HEAD | while read filename; do
  echo "$(git log -1 --format="%ad" -- $filename) $filename"
done

Isso produzirá a saída da seguinte forma:

Fri Dec 23 19:01:01 2011 +0000 Config
Fri Dec 23 19:01:01 2011 +0000 Makefile

Obviamente, você pode controlar isso, já que é apenas um script bash nesse ponto - sinta-se à vontade para personalizar o conteúdo do seu coração!

    
por 22.06.2012 / 22:10
14

Essa abordagem também funciona com nomes de arquivos que contêm espaços:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {}

Exemplo de saída:

2015-11-03 10:51:16 -0500 .gitignore
2016-03-30 11:50:05 -0400 .htaccess
2015-02-18 12:20:26 -0500 .travis.yml
2016-04-29 09:19:24 +0800 2016-01-13-Atlanta.md
2016-04-29 09:29:10 +0800 2016-03-03-Elmherst.md
2016-04-29 09:41:20 +0800 2016-03-03-Milford.md
2016-04-29 08:15:19 +0800 2016-03-06-Clayton.md
2016-04-29 01:20:01 +0800 2016-03-14-Richmond.md
2016-04-29 09:49:06 +0800 3/8/2016-Clayton.md
2015-08-26 16:19:56 -0400 404.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-bradycardia-algorithm.htm
2015-12-23 17:03:51 -0500 _algorithms/acls-pulseless-arrest-algorithm-asystole.htm
2016-04-11 15:00:42 -0400 _algorithms/acls-pulseless-arrest-algorithm-pea.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-secondary-survey.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-suspected-stroke-algorithm.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-tachycardia-algorithm-stable.htm
...

A saída pode ser classificada por timestamp de modificação, adicionando | sort ao final:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort
    
por 03.05.2016 / 17:35
2

Este é um pequeno ajuste da resposta de Andrew M. (Eu não pude comentar sua resposta.)

Quebra o primeiro $ filename entre aspas duplas , para suportar nomes de arquivos com espaços incorporados.

git ls-tree -r --name-only HEAD | while read filename; do
    echo "$(git log -1 --format="%ad" -- "$filename") $filename"
done

Exemplo de saída:

Tue Jun 21 11:38:43 2016 -0600 subdir/this is a filename with spaces.txt

Eu aprecio que a solução de Andrew (baseada em ls-tree ) funciona com repositórios nus! (Isso não é verdade para soluções usando ls-files.)

    
por 21.06.2016 / 20:15
0

Aqui está a versão da versão de peixe de Andrew M, para aqueles que usam peixe.

git ls-tree -r --name-only HEAD | while read -l filename
    printf '%s %s\n' (git log -1 --format="%ai" -- $filename) $filename
end

Eu armazeno isso como uma função de peixe para facilitar o acesso.

    
por 09.03.2018 / 17:28