【问题标题】:Retrieve Git push history?检索 Git 推送历史?
【发布时间】:2019-01-16 07:07:51
【问题描述】:

Git 是否会记录推送到任何地方的远程的历史记录?

我注意到,我们能够在 Microsoft VSTS 中查看 Git 存储库的推送历史记录以及每次推送的相关提交。它甚至显示旧的、过时的提交,由于后来的强制推送重写了提交历史,这些提交不应该再存在了。这些附加信息是 VSTS 专门提供的,而不是 Git 内置的吗?

【问题讨论】:

  • 不能是通过pre-push 钩子自动化的一些标签吗?标记提交确实可以防止垃圾收集和历史重写。值得检查 ref/tags 吗?在这种情况下,VSTS 只是保留对标签本身的内部引用是有道理的
  • Git 本身没有(记录推送操作——从技术上讲,就 Git 本身而言,这些只是 git receive-pack 调用,通过 ssh 或 Web 服务器或其他方式运行)。各种附加组件可能。
  • @ohitsderrick,你这边的这个问题呢?你解决了吗?
  • @JackZhai-MSFT 我认为 Daniel 下面关于 git gc 未实施的回答解释了我所看到的。我从在本地克隆上运行 git gc 的不同线程读取 this answer,删除 VSTS 上的整个远程存储库,然后推回最近清理的本地存储库将是清理过时对象的唯一方法。

标签: git version-control azure-devops dvcs


【解决方案1】:

如果您在下面的屏幕截图中谈论远程侧推历史,不确定我是否完全理解您的意思。

对于本地回购,你可以看看这个线程:

其实,当你执行 git reflog expire --expire=now --all 和 git gc --prune=now,删除了 danglind 提交。你可以加倍 通过 git fsck --full 检查。如果输出没有显示提交,那 表示没有悬空提交。

但是你不能为远程 git repo 执行任何 git 命令,这应该是由this 引起的,正如 Daniel 上面也提到的那样:

我们向 VSTS 推出了提交可达性位图索引并删除了 下面提到的克隆作弊。克隆将不再下载 无法到达的对象!。我们仍然没有真正的对象级 git gc on 服务器还没有,但克隆大小现在会更小。

TFS on-prem 将在 v.Next 中获得这些更改(不在任何 TFS 2017 更新,但下一个主要版本)。

【讨论】:

    【解决方案2】:

    这是因为 VSTS 没有为其 repos 实现 git gc。即使不再引用提交(例如由于强制推送),它们仍然存在。

    参考: https://blogs.msdn.microsoft.com/congyiw/2015/12/14/why-does-cloning-from-vsts-return-old-unreferenced-objects/

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 2015-07-07
      • 2019-11-29
      • 2012-07-27
      • 2021-04-11
      • 2019-04-10
      • 2017-04-11
      • 2012-12-01
      • 2011-06-27
      相关资源
      最近更新 更多