是否正在努力开发具有文件自动更改检测功能的面向构建的文件系统?

2024-01-25

我最近开始使用 Git。 我发现的有趣功能之一是使用哈希来快速检测更改。

另一方面,我看到构建工具(如 make、ant、javac 等)尝试通过检查文件的时间戳来检测源文件中的更改。

这种方法的问题是:

  1. 如果您从事不止一项工作 机器,你必须确保所有 时钟是同步的,否则, 可以考虑新文件 不变,因为另一台机器的时钟给了它相对于构建机器的过去的时间戳。
  2. 在大型项目中,您必须扫描所有文件的时间戳才能检测更改。

我想知道是否有人已经采用了 Git 方法来处理这些问题:

  1. 每个文件都有一个唯一的哈希值,具体取决于其内容,而不是时间戳。
  2. 每个目录也有其哈希值,具体取决于目录中的文件及其哈希值。
  3. 由于上述规则,即使是源代码树内部的简单更改也会导致根目录具有不同的哈希值

这种机制可以帮助使构建工具更快,因为检测源树中的更改是哈希比较的简单操作。如果源树根目录的哈希值发生了变化,则意味着源树中发生了更深层的变化,因此继续递归地扫描树以查找变化——就像 Git 检测变化一样。

这并不一定意味着这个源代码树必须由 Git 管理。 我的想法是,文件系统将自动提供文件的哈希码作为其属性/元数据之一,因此构建工具可以依赖于此而不是时间戳。此外,目录哈希会自动反映其中文件的状态。

我已经阅读了一些有关 Sun ZFS 的内容,但我不确定它是否是一个可以加快构建速度的完整解决方案。

你觉得这个想法怎么样? 已经有这样的文件系统了吗? 已经有这样的构建工具了吗?


我认为你试图解决的问题实际上不是问题:

使用 NTP 可以很大程度上避免时钟偏差问题。

当然,完全消除时钟偏差问题固然很好,但我们可能会同意,使用相当复杂的内容跟踪系统来解决该问题是矫枉过正的。

关于性能,扫描整个树在实践中往往不是问题。stat速度快得离谱(只要你不是使用 Windows)--ls -lR > /dev/null在我的系统上,遍历整个 Linux 内核树(38k 文件)需要 350 毫秒。

事实上,如果对所有文件进行统计是一个问题,那么您的版本控制系统将会变得很慢,这将是一个比构建性能更大的问题。每一个git status or git diff,例如,统计all工作副本中的文件来检查它们的修改时间,因此您最好希望速度很快。

所以如果你想加快速度make,不看文件系统;与实际消耗构建时间的任何事情相比,它很可能微不足道。

希望能让您放心!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否正在努力开发具有文件自动更改检测功能的面向构建的文件系统? 的相关文章

  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • Git:以新名称签出旧版本的目录

    如何以新名称查看目录的先前版本 我一直都有一个目录foo在我的仓库中 我想创建一个目录foo old在我当前的工作树中 其内容是HEAD 2 foo 我同时需要两个版本 以确保它们给出相同的结果 测试这需要相当多的代码 并且需要同时提供两个
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 将两个 VS2010 C++ 项目构建到同一输出文件夹中

    我在同一个 VS 2010 解决方案中有两个项目 他们重复使用相同的代码 我希望 VS2010 将两个项目的可执行文件构建到同一个输出文件夹中 显然这并不是微不足道的 尽管http msdn microsoft com en us libr
  • http.h:6:23: 致命错误:curl/curl.h:没有该文件/目录

    我在 CentOS 7 中下载 git 包 wget https www kernel org pub software scm git git 2 0 1 tar gz tar xzf git 2 0 1 tar gz 当我编译git时
  • 文件系统文件名转义? C#

    我允许用户选择他想要的任何用户名 它可以是任何用户名 例如 AC Man 现在我需要为他创建一个目录 我使用什么函数来转义文本 这样我就不会出现 FS 问题 异常 无论您替换无效字符还是删除它们 总是存在发生冲突的可能性 如果我是你 我会为
  • Git 中的数据完整性?

    我现在已经多次听到提到 Git 提供数据完整性 但是 这是什么意思 据我所知 git 中的所有对象都是使用 SHA 1 校验和来访问的 并且该校验和是根据文件的内容计算的 这意味着如果文件发生更改 您将得到不同的校验和 但这如何提供数据完整
  • Heroku 应用程序上的 Nodejs Express EACCES 0.0.0.0:80

    我正在尝试在他们的网站上新创建的 Heroku 应用程序上运行 Node 应用程序 我按照他们的步骤操作 但在显示应用程序状态时仍然遇到错误 我跟着Node js 入门 https devcenter heroku com articles
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • VS Code 在交互式变基期间不会等待我 [重复]

    这个问题在这里已经有答案了 如果我使用交互式变基git rebase i使用为 Git 配置的默认编辑器 一切都运行良好 如果我在我的全局中添加以下内容 gitconfig core editor C Program Files x86 M
  • 如果您使用 CocoaPods,您的 .gitignore 中会包含什么内容?

    我从事 iOS 开发已经几个月了 刚刚了解到有前途的可可豆荚 http cocoapods org 用于依赖管理的库 我在个人项目上尝试过 添加了依赖项Kiwi https github com allending Kiwi到我的 Podf
  • 为什么 git 在每次合并时都运行“git gc --auto”?

    今天 git 开始表现得很有趣 嗯 比平时更有趣 坚持运行git gc每次合并后 即使它们是背靠背的 C Projects my current project gt git pull remote Counting objects 31
  • 是否可以使用“git gc”来打包引用日志对象?

    正如答案所暗示的https stackoverflow com a 32025729 https stackoverflow com a 32025729我已经配置了远程裸仓库 git config gc pruneExpire never
  • 将 GIT 存储库中的文件标记为暂时忽略

    我们正在从 Perforce 迁移到 GIT 当然 我希望存储库中有一些文件 但个人开发人员不应该定期签入它们 诸如 eclipse 项目文件之类的东西 每个开发人员可能会获得初始的 project 文件 但随后会根据自己的环境稍微调整它
  • 使用 svn 元数据克隆 git-svn 存储库

    我已经克隆了我的主存储库git svn clone svn url trunk stdlayout 现在我想使用 svn 元数据克隆存储库 这样我就能够git svn rebase它到主服务器 注意 我不想在两个之间推送提交git svn克
  • 为什么我无法推送这个最新的 Git 子树?

    我将 Git 子树与我正在开发的几个项目一起使用 以便在它们之间共享一些基本代码 基本代码经常更新 升级可能发生在任何项目中 最终所有项目都会更新 我遇到了一个问题 git 报告我的子树是最新的 但推送被拒绝 例如 git subtree
  • “git merge”和“git rebase”有什么区别?

    有什么区别git merge and git rebase 假设最初有 3 次提交 A B C 然后开发人员 Dan 创建了提交D 开发者 Ed 创建了提交E 显然 这一冲突应该以某种方式得到解决 为此 有两种方法 MERGE 两者都提交D
  • Git 预提交挂钩未在 Windows 上运行

    我刚刚开始研究 Git 挂钩 但我似乎无法让它们运行 我设置了一个本地存储库 因此我的项目文件夹中现在有一个 git 目录 我已将名为 pre commit cmd 的 cmd 文件添加到 C path to my project git
  • 如何在解决冲突的过程中提交长 Git 合并

    我正在进行一次大型合并 其中包含 300 多个冲突文件 我想使用 mergetool 来解决这些问题 但我不可能一次性完成这一切 我如何提交合并 然后返回并继续相同的合并 通常 如果索引中存在冲突 git 似乎不允许您提交 我假设 不能一次

随机推荐

  • rolling.apply 应用于需要多列数据帧以减少单列的自定义函数

    我正在尝试为我的内容创建一个附加列df newc 通过滚动 申请df cond 具有自定义功能 自定义函数需要两列df 我不知道如何让它发挥作用 I tried df newc df cond rolling 4 apply T corre
  • 检查资源中是否存在 ID (R.id.something)

    因此 我有代码使用 AtomicInteger 为多个元素生成 ID 该 AtomicInteger 默认设置为 Integer MAX VALUE 并且随着分配 ID 的每个视图从那里递减 所以第一个带有生成 ID 的视图将是Intege
  • “django 视图中出现未知列‘user_id’错误

    我遇到一个错误 我不确定是什么原因造成的 这是错误 Exception Type OperationalError Exception Value 1054 Unknown column user id in field list 有谁知道
  • Spring Data Mongo @Column 等效注释(@Property?)

    是否有与 JPA Column 注释等效的 SpringData Mongo 基本上 我有一个 POJO 其中有一个属性 我想用不同的名称将其存储在 Mongo 中 因此 以下对象 public class Pojo Property ba
  • 使用 imagemagick montage 命令将平铺图像粘合在一起,无需调整大小

    这似乎是一个相当常见的问题 所以我将使用我能想到的尽可能多的关键字来问它 我有一堆 嗯 九个 平铺 jpeg 带有标准平铺文件名 每个 jpeg 均为 220x175 像素 top row tile 1 0 0 jpg tile 1 1 0
  • 显示吸气剂

    我正在研究getters setters 一般的想法是它们是邪恶的 应该避免 您应该让对象完成工作并产生结果 阅读材料 为什么 getter 和 setter 方法是邪恶的 https www javaworld com article 2
  • ASP.NET,如何管理不同类型角色的用户

    我想创建一个包含不同用户的网站 用户可以有不同的角色 管理员和用户 这是一个有据可查的情况 但我还想根据用户的位置对用户进行分组 因此在每个位置我都可以拥有管理员和用户 多维角色系统 原因是 德国用户应该有权访问一组特定的文档 而意大利用户
  • 访问数组内的对象

    I m trying to access values inside Firebase array gt object 当我尝试访问 v for 内部的值时 它运行良好 但我不能这样做 postDetail author 它返回未定义 解决
  • 无法阻止 Visual Studio 2015 在 JS 文件中滞后数秒,提示“JavaScript 语言服务正在后台处理您的请求...”?

    在状态栏中 当我输入 Js 文件时 它会在键盘上显示此消息 并且编辑器挂起 2 或 3 秒 这大概当我将一些 Js 文件移动到类别文件夹中时突然开始发生但我不确定这是原因 我不知道是什么问题 在出现问题之前 所有 js 文件都位于同一文件夹
  • 如何访问 jquery ajax 调用返回的数据? $.ajax(...) 之外;

    我如何访问 jquery ajax 调用返回的数据 在 ajax 之外 Reloads the inital page function jobexist jobname var dataString jobname jobname var
  • Android O Gradle 构建因 travis ci 失败

    我正在尝试将 Travis CI 用于我的 Android 项目 但我的构建不断失败 但可以在本地构建上运行 我正在使用 Android Studio Preview 3 和 gradle 3 alpha 3 我在下面收到此错误 找不到 c
  • 如何删除正在执行的jar文件

    我创建了一个应用程序 在该应用程序中 它根据操作修改 jar 内的属性文件 我可以使用更新的更改创建一个新的临时 jar 但无法将 jar 文件重命名为现有的 jar 文件名 由于它正在运行 我无法删除和重命名它 任何人都可以提出任何操作或
  • data.table 中的条件连接?

    我有以下数据表 dtgrouped2 MonthNo Unique Total 1 1 AAA 10 2 1 BBB 0 3 2 CCC 3 4 2 DDD 0 5 3 AAA 0 6 3 BBB 35 7 4 CCC 15 8 4 AAA
  • Spark Select 与 Scala 列列表

    我正在尝试找到一种使用 List Column 进行火花选择的好方法 我正在爆炸一列 而不是通过爆炸列传回我感兴趣的所有列 var columns getColumns x Returns a List Column tempDf sele
  • 如何在 Seaborn 热图旁边添加列

    鉴于下面的代码会生成热图 我如何获得 D 列 总列 要在热图右侧显示为无颜色的列 只需对齐每个单元格的总值 我还试图将标签移到顶部 我不介意左侧的标签是水平的 因为我的实际数据不会出现这种情况 import matplotlib pyplo
  • len() 是 python 中的函数还是方法?

    在面向对象编程的上下文中 函数不同于方法 当我检查帮助文档时 这段代码 len outputs Signature len obj Docstring Return the number of items in a container Ty
  • 如何将 .gif 转换为 byte[][]?

    我正在使用一个有方法的 API public void setImage byte newImage API 参考中给出的唯一信息是 该图像的格式是简单的原始2D array字节数 每个字节代表灰度black 0 to white 255
  • 在 Windows 上的 Cmake 中链接不同的库以进行调试和发布构建?

    因此 我有一个正在编译的库 我需要链接不同的第三方内容 具体取决于它是调试还是发布版本 特别是这些库的发布或调试版本 在 Cmake 中有一个简单的方法可以做到这一点吗 编辑 我应该注意我正在使用 Visual Studio 根据CMake
  • Debian httpredir 镜像系统在 Docker 中不可靠/不可用?

    简洁版本 Debian 的httpredir debian org镜像服务导致我的 Docker 构建经常失败 因为 apt get 无法下载包或连接到服务器或类似的东西 我是唯一一个有这个问题的人吗 问题是我的 Debian 的还是 Do
  • 是否正在努力开发具有文件自动更改检测功能的面向构建的文件系统?

    我最近开始使用 Git 我发现的有趣功能之一是使用哈希来快速检测更改 另一方面 我看到构建工具 如 make ant javac 等 尝试通过检查文件的时间戳来检测源文件中的更改 这种方法的问题是 如果您从事不止一项工作 机器 你必须确保所