2016-11-05 4 views
2

gitリポジトリのローカルコピーで日付の後にコミットされたコミットを取得し、ファイルの関連する変更を抽出しようとします。頑丈なコミットに適切な差分/パッチを選択する方法

私はgitのコマンドにこれを比較したい場合、それは次のようになります。ここでは

git log -p --reverse --after="2016-10-01" 

は、私が使用するスクリプトです:

require "rugged" 
require "date" 

git_dir = "../ruby-gnome2/" 

repo = Rugged::Repository.new(git_dir) 
walker = Rugged::Walker.new(repo) 
walker.sorting(Rugged::SORT_DATE| Rugged::SORT_REVERSE) 
walker.push(repo.head.target) 

walker.each do |commit| 
    c_time = Time.at(commit.time) 
    next unless c_time >= Date.new(2016,10,01).to_time 

    puts c_time 
    puts commit.diff.size 
    puts commit.diff.stat.inspect 
end 

問題は、それはたくさんのように見えるということですここでファイルの変更はこのスクリプトの出力の終わりです:

2016-10-22 17:33:37 +0200 
2463 
[2463, 0, 271332] 

つまり、2463のfi変更された/削除された/置き換えられたファイル。 git log -p --reverse --after="2016-10-22"は、2つのファイルのみが変更されていることを示しています。

gitコマンドと同じ結果を得るにはどうすればよいですか?つまり、このコミットによって変更された実際のファイルを見つけるにはどうすればよいですか?

答えて

1

私は頑丈なチームから何の答えもありませんでしたので、私はlibgit2-glibここにhttps://github.com/ruby-gnome2/ggitのルビーゴーボディーイントロスペクションローダーを実行しました。ここhttps://github.com/ruby-gnome2/ruby見て、

require "ggit" 

PATH = File.expand_path(File.dirname(__FILE__)) 

repo_path = "#{PATH}/ruby-gnome2/.git" 

file = Gio::File.path(repo_path) 

begin 
    repo = Ggit::Repository.open(file) 
    revwalker = Ggit::RevisionWalker.new(repo) 
    revwalker.sort_mode = [:time, :topological, :reverse] 
    head = repo.head 
    revwalker.push(head.target) 
rescue => error 
    STDERR.puts error.message 
    exit 1 
end 

def signature_to_string(signature) 
    name = signature.name 
    email = signature.email 
    time = signature.time.format("%c") 

    "#{name} <#{email}> #{time}" 
end 

while oid = revwalker.next do 
    commit = repo.lookup(oid, Ggit::Commit.gtype) 

    author = signature_to_string(commit.author) 
    date = commit.committer.time 
    next unless (date.year >= 2016 && date.month >= 11 && date.day_of_month > 5) 
    committer = signature_to_string(commit.committer) 

    subject = commit.subject 
    message = commit.message 

    puts "SHA: #{oid}" 
    puts "Author: #{author}" 
    puts "Committer: #{committer}" 
    puts "Subject: #{subject}" 
    puts "Message: #{message}" 
    puts "----------------------------------------" 

    commit_parents = commit.parents 
    if commit_parents.size > 0 
    parent_commit = commit_parents.get(0) 
    commit_tree = commit.tree 
    parent_tree = parent_commit.tree 

    diff = Ggit::Diff.new(repo, :old_tree => parent_tree, 
          :new_tree => commit_tree, :options => nil) 

    diff.print(Ggit::DiffFormatType::PATCH).each do |_delta, _hunk, line| 
     puts "\t | #{line.text}" 
     0 
    end 

    end 

end 
0

私はruby-gnome2/ruby-gnome2のクローンを作成する場合、それはあなたが2463を取得するために、それはすべてののファイルが変更されているとして私を打つので、2400+ファイルがあると言われます。

これは、最初の親コミットに対して現在のコミット(by the Walkerを返す)とデフォルトでは異なる、rugged#commit.diffの通常の動作とは異なります。

git config core.autocrlfなどの設定がtrueに設定されているかどうかを確認してください(ローカルレポを変更する可能性があります)。

+0

は残念ながら、違いはありません。

今、私はデフとのgitコマンド・ライン・インターフェースに対応したログを見つけることができます-gnome2 /コミット/マスター、これは私のテストに使用するレポです。 「2016-10-22」の日付以降に2463のファイルが変更/削除/置換されていないことが簡単に分かります。 – cedlemo

+0

@cedlemo:はい、 'git log --name-status --online --after =" 2016-10-22 "は3つのファイルしか表示しません。つまり、スクリプトに問題があることを意味します。その日の前にコミット*をカウントしているからですか?結局、 'git log --name-status --oneline --before =" 2016-10-22 "--all --branches | grep -e"^M "| sort | uniq | wc'は3362個のファイルを与えます。 '' c_time> = Date.new(2016,10,01).to_time'が疑わしいのであれば... – VonC

+0

'' c_time> = Date.new(2016,10,01)私は、最後のコミットが偽である2463個のファイルが変更されていることを意味する、コミットに対するループの最後の繰り返しです。スクリプトには問題があるかもしれませんが、どこには表示されません。 – cedlemo

関連する問題