- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
对于 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/
使用安装了依赖项的 openSUSE 和 Ubuntu 我无法使用 Rugged::Repository.clone_at 方法克隆远程存储库并收到错误消息: Rugged::NetworkError
我计划使用 Rugged 以编程方式访问 Git 存储库。 我需要找出在特定提交中更改的文件。 根据文档,提交对象提供以下内容。 留言 时间 作者 树 parent 我尝试了“树”路线,但未能成功。
我正在尝试使用 rugged 来做一些非常简单的事情:创建并提交一个文件,使存储库保持与执行时相同的状态: git init echo "blah blah blah" > blah.txt git
我正在尝试使用 Rugged 以编程方式创建对现有存储库的提交(libgit2 的 Ruby 绑定(bind))。我已尝试遵循 Rugged README 中提供的文档,但我认为它与代码库的当前状态不
我对在这个网站上提问非常陌生,但通过阅读它学到了很多东西,所以非常感谢! 有点随机,看到了这个页脚上这种令人敬畏的“地毯下”风格的视差效果 - 并寻找一些关于如何将其提升的提示? http://ide
我正在尝试使用以下测试脚本创建 rugged 提交: require "rugged" r = Rugged::Repository.new(".") index = r.index index.re
我尝试在 git 存储库的本地副本中获取某个日期之后完成的提交,然后提取文件的相关修改。 如果我想将其与 git 命令进行比较,它将是: git log -p --reverse --after="2
遵循本教程[ link ] 在专用服务器上安装 gitlab。我需要: sudo -u git -H bundle install --deployment --without development
使用 rugged 如何执行以下操作:fetch、pull 和 rebase? 我正在使用 development 分支并在查看其文档后 found here作为 Remote 类的指南。 编辑: 因
我如何使用 rugged检查我的 git 仓库中是否有未提交的更改? 很像How do I programmatically determine if there are uncommited cha
我最近开始使用 Rugged,并且已经遇到了一些问题。基本上我想做的就是将所有内容添加到 Git 存储库中,提交阶段性更改,然后将所有内容推送到一个分支。我从第一步开始,如下所示: @repo = R
我正在使用 ruby 脚本在给定的 git 存储库上执行以下 git 命令。 branches = `git branch -a --contains #{tag_name}` 这种方法在命令
对于 git 存储库中的给定文件,我想查找修改文件的最后一次提交的 SHA 以及时间戳。 在命令行中,此数据可通过 git 日志查看特定文件路径,例如 git log -n 1 path/to/fil
如何使用 Rugged ruby gem 从远程存储库中提取更改。由于 api 已更改,关于此主题的大部分问题都已过时。我正在使用一个简单的 repo 协议(protocol),没有什么复杂的。我
我正在尝试制作一个 MEAN CRUD 应用程序。我不太确定哪条路线已关闭,但我似乎无法与 mongodb 通信来显示数据。当“rug-list.component.ts”调用“rug.service
我正在使用坚固的 gem,它使用 libgit2 在 git 存储库上运行。它工作正常,但扩展做了一些奇怪的事情并干扰了其他库的功能。在我的例子中,net/http 开始抛出异常。 在我的例子中,这是
我正在尝试为 Gitlab CI 设置 pronto,在本地一切正常,但是当 pronto 在 Gitlab CI 上运行时“Rugged::ReferenceError: revspec 'orig
我是一名优秀的程序员,十分优秀!