【发布时间】:2014-09-09 12:59:29
【问题描述】:
我正在尝试使用 JGit 尽可能多地检索 Git 上的文件信息。
使用getCommitTime,我可以获得提交文件的时间。是否也可以获得文件被修改/更新/编辑的时间?我还没有找到像 getModifiedTime 这样的东西。
【问题讨论】:
-
Git 不记录修改时间戳。见stackoverflow.com/questions/25085396/…
我正在尝试使用 JGit 尽可能多地检索 Git 上的文件信息。
使用getCommitTime,我可以获得提交文件的时间。是否也可以获得文件被修改/更新/编辑的时间?我还没有找到像 getModifiedTime 这样的东西。
【问题讨论】:
你运气不好。 Git 在名为“blob”的对象中记录文件的内容,在树对象中记录文件名,但它不记录时间戳 与文件关联。
当您检出文件时,工作树中文件的修改时间戳实际上设置为内核时钟显示的当前日期和时间。
您可能使用make 实用程序(或类似工具)来自动化您的构建。如您所知,make 依靠修改时间戳来确定必须构建哪些目标(如果有)。
让我们想象一下如果 Git 确实记录(并在结帐时恢复)已提交文件的修改时间戳会发生什么。假设您有一个只有一个跟踪文件 foo 的存储库,这是一个名为 bar 的目标的唯一依赖项:
foo -> bar
让我们进一步假设,
你的历史由两个提交组成:
A -- B [HEAD=master]
提交A中foo的修改时间戳是“今天”,上午9点,
B中foo的修改时间戳是“今天”,上午10点。您当前已签出提交 B,并且您已在上午 10:05 运行 make,因此您的工作树中的构建 (bar) 是最新的。但是,您决定要返回提交A,并从那里创建并签出一个分支(可能将foo 带到不同的方向):
git checkout -b other HEAD^
您的 repo 现在如下所示
A [HEAD=other]
\
B [master]
如果你再次运行make,为了构建对应于提交A的bar的版本,make将比较跟踪和当前签出文件foo的修改时间戳( 9 am) 和未跟踪的文件bar (10:05 am),它会得出结论bar 是最新的,不需要再次构建。
要强制 make 再次构建 bar,您必须 touch foo。这很麻烦,当然,随着项目中跟踪的make 依赖项数量的增加,问题会变得更糟。
因此,Git 在结帐时不记录和恢复跟踪文件的修改时间戳并不是一件坏事。
相关阅读:
【讨论】: