Git是否会克隆、获取或推送孤立的提交?

6
孤儿提交是指在父提交图中没有包含它们的标签或分支时创建的提交。例如,如果您创建一个名为foo的分支,并添加提交ab,然后删除该分支(即从提交b中删除引用foo),则除非您保存了它们的哈希值,否则ab将无法访问。请注意保留HTML标记。
x-x-x-x   <- master
     \
      a-b  <- foo (reference then deleted or reset to somewhere on master)

基本的Git行为是清理并删除孤立提交(听说默认至少为30天)。
我的问题是:Git是否会使用git clone、git fetch或git push命令将孤立提交从一个存储库移动到另一个存储库?还是说,对于任何没有直接调用孤立提交哈希(例如checkout或cherry-pick)的操作,Git都会忽略这些提交?

当您在本地机器上克隆存储库时,至少会这样。例如,git clone ~/foo.git -- ~/bar。如果远程存储库位于另一台服务器上,则不会。但我不确定。我猜这取决于协议。 - ElpieKay
@ElpieKay 是正确的,这真的取决于底层的传输协议。如果发送方的 Git 选择(出于任何原因)将对象放在一个 pack 中发送,接收方的 Git 将接收到它们,并且必须重新打包该 pack 来删除它们。然而,一般来说,通过从名称开始收集对象的任何操作都不会收集这些对象,因此也不会发送它们。 - torek
1个回答

7
在正常的Git工作流程中,这些提交被忽略。包括git clonegit pushgit fetch。但是根据Git仓库托管服务器的不同,如果需要的话,您可能可以将它们拉回到您的仓库中。
这就是我在“github是否记住提交ID?”中所描述的:通过GitHub事件API,您可以获取(例如)已删除分支的SHA1,并以此方式在自己的仓库中还原它。
这弥补了git reflog通常无法在远程端访问/公开的事实。

谢谢 - 但我并不是真的想把它们删除,只是想建立行为模式以便我理解。有些情况下,您可能希望孤立的提交只是消失而不被传输到任何地方,而其他情况下则可能希望尝试恢复它们。 - LightCC
我明白。它们不会被传递,除非你像我在答案中所示的那样积极地寻求引用它们。 - VonC
我编辑了你的回答 - 请验证我在改写中理解得是否正确。最终似乎有一些技巧可以找到一个在远程上变成孤儿的提交,你总是可以在本地使用reflog来实现这一点,但通常孤立的提交不会通过普通的git命令传输到其他存储库,无论是否有特殊标志。 - LightCC
1
@MadPhysicist 为了确保孤立的提交在远程服务器端被删除,我建议联系 Git 存储库托管服务的支持团队(例如 BitBucket 支持:https://support.atlassian.com/contact),并请求删除该提交(可能需要通过 git gc 或者 更近期的 git maintenance 进行操作)。 - VonC
1
@MadPhysicist 那个孤立的提交是否有问题?通常情况下,应该忽略它。 - VonC
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接