【问题标题】:How to check file creation date with github api如何使用 github api 检查文件创建日期
【发布时间】:2016-08-29 20:23:14
【问题描述】:

我正在使用grab the contents of files 的github api,但我还想查看文件的创建时间。有没有办法通过 github api 获取这些信息?

【问题讨论】:

标签: git github github-api


【解决方案1】:

commits 端点可以通过path parameter 过滤,因此它只返回触及给定路径的提交。除非您想变得棘手并提出多个请求来跟踪文件移动/重命名,否则我只会使用返回的最远提交的提交日期。

【讨论】:

    【解决方案2】:

    Git 不存储文件 创建日期(从某种意义上说,Git 的文件没有 创建日期)。无论如何,你也许能得到一些对你有用的东西,但 GitHub 的界面将你引向错误的方向。

    如果你仔细检查"create a file" operation,并且熟悉Git,你会意识到它根本没有真正创建文件:相反,它创建了一个新的commit。这就是为什么它需要提交消息,并允许作者和提交者。

    这意味着你必须找到一个包含该文件的提交,然后是retrieve the information about that commit。这里的问题是双重的:

    • 找到包含该文件的提交,并且
    • 定义“创造”的含义

    要查找提交,您需要提交哈希(SHA-1 ID)。获取提交哈希的主要地方是提交。因此,您需要一个提交哈希才能找到提交哈希。这当然是个问题。

    要打破这里的僵局,你必须从looking up a reference开始。引用只是与 Git 对象哈希配对的名称——通常但不总是,commit 对象哈希。然后,您使用该引用来定位提交:如果引用直接指向提交,那么您就在那里;如果它指向一个标签(一个带注释的标签对象),你读取标签对象,其中包含另一个哈希 ID。继续阅读这些对象,直到您找到不是标签的东西。如果这是一个提交,你就成功了。如果它是一棵树或一个 blob,则该标签一开始不会导致提交,并且您可能对此不感兴趣。

    您要开始使用的引用与您检索文件时使用的引用相同。

    现在您确实拥有了一个提交 ID 并且可以检索该提交,现在是时候查看该提交中是否存在相关文件了。大概它确实存在那个特定的提交,因为您一直在检索文件。但该文件可能不是在该提交中创建:它可能只是从先前的提交中继承而来。

    如果“创建”是指“最近的提交是什么时候创建的”,您可以在此处停止:获取提交并使用作者日期和/或提交者日期。但是,如果您的意思是“在某个 previous 提交中找到一个提交,但文件 存在”,那么您必须做更多的工作。您现在必须retrieve the tree object associated with each commit,以查看在特定提交中是否存在某些文件$path,例如foo/bar.txt(您一直使用的其他API仅从tip-most 提交给定的参考)。

    请注意,每个提交都可以有多个父项。这发生在合并提交上。大多数这样的提交都有两个父母,但任何高于 1 的数字都是可能的。在查看包含某些文件路径 $path 的合并提交时,它的每个(多个)父级也可能具有文件 $path 或缺少文件 $path。这就是“定义所创建的含义”变得特别困难的地方。

    • 对于具有 no 父级的提交(根提交),如果文件 foo/bar.txt 存在,则显然会在此处“创建”。
    • 对于具有 one 父级的提交,如果 foo/bar.txt 存在于此提交中,但不存在于此提交的父级中,则显然文件 foo/bar.txt 已“创建”。
    • 对于具有 两个或多个 父级的提交,如果 foo/bar.txt 存在于该提交中,则明确文件 foo/bar.txt 是“创建”的,但不存在于其 任何 中父母。
    • 但是对于具有两个或更多父级的提交,如果 foo/bar.txt 存在于此提交中并且 部分但不是全部 父级,文件是否“已创建”?

    一旦您解决了这个问题,您就可以开始了,但需要注意一些小问题。首先,“获取树”API 接口施加了限制,因此对于更大的树,您必须克隆存储库。其次,这样做所涉及的工作通常与克隆存储库相同:您基本上是在重新实现 Git。您不妨只使用 Git。

    【讨论】:

    • “你不妨只使用 Git”似乎是你整个答案的重点,但使用 git 可能不是一个选项。例如,考虑一个仅使用 GitHub api 的单页应用程序。
    • @ShawnErquhart:在这种情况下,您必须重新实现 Git 的大块,并且放弃对大小超过 GitHub API 的树的答案。如果这就是你想要的,那就去吧! :-) 说真的,“通过影响文件的提交过滤”可能是一个很好的近似值。
    【解决方案3】:

    面对同样的问题,在阅读了上面的分析之后,经过一番挖掘。我找到了一个技巧。

    当您浏览存储库时,打开 chrome 开发面板 -> 网络选项卡。然后选择一个新文件夹进行浏览。应该有一个像xxxx/file-list/xxxx这样的xhr请求,所以这个请求也可以从我们的代码中重新发出,并解析响应以提取每个文件项的最后修改日期。

    我知道这不是一个好方法,但也许可以提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2022-08-02
      • 2013-09-11
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多