【问题标题】:Will Git ever clone, fetch, or push orphan commits?Git 会克隆、获取或推送孤儿提交吗?
【发布时间】:2018-03-26 07:17:24
【问题描述】:

当在其父提交图中没有包含它们的标记或分支时,将创建孤立提交。例如,如果您创建一个分支foo,添加提交ab,然后删除该分支(即从提交b 中删除引用foo),然后ab除非您保存了他们的哈希值,否则将无法访问。

x-x-x-x   <- master
     \
      a-b  <- foo (reference then deleted or reset to somewhere on master)

孤立提交的基本 Git 行为是最终垃圾收集并删除它们(我听说默认值至少为 30 天)。

我的问题是这样的:

Git 是否会使用 git clonegit fetchgit push 命令将孤立提交从一个存储库转移到另一个存储库?

或者对于不直接调用孤儿哈希的任何操作(例如checkoutcherry-pick),Git 是否有效地忽略这些提交?

【问题讨论】:

  • 至少当您在本地计算机上克隆存储库时会这样做。例如,git clone ~/foo.git -- ~/bar。如果远程存储库位于另一台服务器上,则不会。但不确定。我想这取决于协议。
  • @ElpieKay 是正确的,它确实取决于底层传输协议。如果发送 Git 选择(无论出于何种原因)将对象发送到包中,则接收 Git 会获取它们,并且必须重新打包以丢弃它们。但是,作为一般规则,任何从名称开始收集对象的东西都不会收集这些对象,因此不会发送它们。

标签: git git-push git-clone git-fetch orphan


【解决方案1】:

在正常的 Git 工作流程中,这些提交会被忽略。这包括git clonegit pushgit fetch。但是根据 Git 存储库托管服务器,如果需要,您可能可以将它们拉回您的存储库中。

这就是我在“Does github remember commit IDs?”中所描述的:通过GitHub Event API,您可以取回(例如)已删除分支的 SHA1,并在您自己的 repo 中以这种方式恢复它。

这弥补了git reflog 在远程端通常不可访问/公开这一事实。

【讨论】:

  • 谢谢 - 但我并不是真的 试图 将它们拉下来,只是试图建立行为以便我理解。在某些情况下,您可能希望孤儿提交死掉而不被传输到任何地方,而在其他情况下,您可能希望尝试恢复它们。
  • 我明白了。它们不会被转移,除非正如我在答案中说明的那样,您积极寻求引用它们。
  • 我编辑了您的答案 - 请确认我在改写时理解正确。最后,似乎有一些技巧可以找到最终在远程上孤立的提交,并且您始终可以在本地使用 reflog,但通常孤立提交不会在具有普通 git 的存储库之间传输命令,带或不带特殊标志。
  • @MadPhysicist 为了确保在远程服务器端删除了孤立的提交,我会联系 Git 存储库托管服务支持(这里是 BitBucket 支持:support.atlassian.com/contact)并请求将所述提交删除(可能通过git gcmore recent git maintenance
  • @MadPhysicist 那个孤儿提交有任何问题吗?通常,它应该被忽略。
猜你喜欢
  • 2021-05-12
  • 2016-04-17
  • 1970-01-01
  • 2011-05-11
  • 2019-08-03
  • 2022-09-29
  • 2021-11-29
  • 1970-01-01
  • 2015-10-27
相关资源
最近更新 更多