Estoy planeando usar Rugged para acceder mediante programación a los repositorios de Git.

Necesito averiguar los archivos cambiados en una confirmación específica.

El objeto de confirmación proporciona lo siguiente, de acuerdo con la documentación.

  • mensaje
  • hora
  • autora
  • árbol
  • madres

Probé la ruta del "árbol", pero no pude.

Veo una pregunta similar en SO, en relación con Grit. Pero me gustaría usar Rugged.

En ruby ​​/ grit, ¿cómo puedo obtener una lista de archivos modificados en una confirmación específica?

2
Geordee Naliyath 17 feb. 2015 a las 20:28

3 respuestas

La mejor respuesta

Puede usar Rugged::Commit#diff para obtener los cambios entre la confirmación y su primer padre u otro Rugged::Commit o Rugged::Tree.

2
Arthur Schreiber 18 feb. 2015 a las 10:24

Una forma más sencilla de obtener todos los archivos en una confirmación específica basada en HEAD.

require "rugged"

repo = Rugged::Repository.new('.')
commit = repo.head.target

paths = commit.diff(commit.parents.first).deltas.map { |d| [d.old_file[:path], d.new_file[:path]] }.flatten.uniq
0
Антон Фоменко 15 may. 2017 a las 09:42

Aquí hay un fragmento basado en la respuesta de Arthur.

require 'rugged'

paths = [];

repo = Rugged::Repository.new('/Users/geordee/Code/HasMenu/data')

walker = Rugged::Walker.new(repo)

walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
walker.push(repo.head.target)
walker.each do |commit|
  # skip merges
  next if commit.parents.count != 1

  diffs = commit.parents[0].diff(commit)
  diffs.each_delta do |delta|
    paths += [delta.old_file[:path], delta.new_file[:path]]
  end

end

puts paths

Esto probablemente omite la primera confirmación.

1
Geordee Naliyath 18 feb. 2015 a las 18:15