gpt4 book ai didi

ruby - 使用 ruby​​ rugged gem 访问 git 日志数据?

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:28 25 4
gpt4 key购买 nike

对于 git 存储库中的给定文件,我想查找修改文件的最后一次提交的 SHA 以及时间戳。

在命令行中,此数据可通过 git 日志查看特定文件路径,例如

git log -n 1 path/to/file

使用 ruby​​ 的“git”gem 我也可以这样做:

require 'git'
g = Git.open("/path/to/repo")
modified = g.log(1).object(relative/path/to/file).first.date
sha = g.log(1).object(relative/path/to/file).first.sha

这很好,但是在遍历很多路径时对我来说运行速度太慢了。由于 Rugged 使用 C 库,我希望它会更快,但看不到如何在坚固的语法中构建正确的查询。有什么建议么?

最佳答案

这应该有效:

repo = Rugged::Repository.new("/path/to/repo")
walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_DATE)
walker.push(repo.head.target)
commit = walker.find do |commit|
commit.parents.size == 1 && commit.diff(paths: ["relative/path/to/file"]).size > 0
end
sha = commit.oid

取自并改编自 https://github.com/libgit2/pygit2/issues/200#issuecomment-15899713

顺便说一句:仅仅因为 rugged 是用 C 语言编写的,并不意味着昂贵的操作突然变得便宜和快速。显然,您节省了大量字符串解析和类似的东西,但这并不总是瓶颈。

由于您对此处的实际文本差异不感兴趣,libgit2 GIT_DIFF_FORCE_BINARY 可能也有助于提高此查找的性能 - 不幸的是,这在 Rugged 中尚不可用(但很快就会。

使用 Rugged 存储库本身对其进行测试,它工作正常:

repo = Rugged::Repository.new(".")
walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_DATE)
walker.push(repo.head.target)
commit = walker.find do |commit|
commit.parents.size == 1 && commit.diff(paths: ["Gemfile"]).size > 0
end
sha = commit.oid # => "8f5c763377f5bf0fb88d196b7c45a7d715264ad4"

walker = Rugged::Walker.new(repo)
walker.sorting(Rugged::SORT_DATE)
walker.push(repo.head.target)
commit = walker.find do |commit|
commit.parents.size == 1 && commit.diff(paths: [".travis.yml"]).size > 0
end
sha = commit.oid # => "4e18e05944daa2ba8d63a2c6b149900e3b93a88f"

关于ruby - 使用 ruby​​ rugged gem 访问 git 日志数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com