是否有任何 git 命令会显式销毁提交?
Are there any git commands that will explicitly destroy a commit?
Git 是否真正销毁了提交或只是孤立了它们?我知道 git 垃圾收集器将在 运行 和 git gc
时删除孤立的提交,无论在 git 配置中设置什么时间间隔。还有其他情况会删除提交吗?
git-prune
有删除孤立对象的明确任务说明。
Git 最终可能会真正销毁某些对象,包括未引用的提交;但它可能不会。通读到底为什么会这样。
最直接的控制是通过 git prune
, git repack
, and git prune-packed
. Running git gc
运行 所有这些,甚至更多。假设 git prune
,甚至 git gc --prune=now
会起作用的主要问题是现在无法访问的对象可能已被 打包。
一般来说,您应该首先使引用日志过期,因为删除过期的引用日志条目可能会导致对象无法访问。使用 git gc
以相对安全的方式以正确的顺序完成所有这些操作:首先过期引用日志,然后是 p运行e(小心),然后重新打包,然后是 p运行e-打包。 prune
步骤抛出 松散 未引用的对象 并且它们自己已过期 。1 之后,其他步骤重新打包正在使用的旧对象,并删除刚刚打包的对象。
这一系列事件就是为什么我们需要 git repack -d
,甚至 -ad
,然后是 git prune-packed
。但是,如果某些包标有 .keep
文件,则这些包将保留,如果它们包含其他未引用的对象,则这些对象也将保留。
1由于多个 Git 命令可能是 运行 并行的,明智的做法是提供一个宽限期,在此期间未引用的对象继续存在,以防万一他们即将成为参考。请注意,插入默认的 14 天宽限期的是 git gc
; git prune
默认为 --expire=now
而不是 --expire=2.weeks.ago
。这给 Git 命令 336 小时来完成他们的工作和巩固参考:例如,git commit
运行s git write-tree
后跟 git commit-tree
,以及这棵树和提交未被引用,直到 git commit
也更新当前分支名称。正常情况下,整个过程只需要几毫秒,所以336小时应该足够了。
Git 是否真正销毁了提交或只是孤立了它们?我知道 git 垃圾收集器将在 运行 和 git gc
时删除孤立的提交,无论在 git 配置中设置什么时间间隔。还有其他情况会删除提交吗?
git-prune
有删除孤立对象的明确任务说明。
Git 最终可能会真正销毁某些对象,包括未引用的提交;但它可能不会。通读到底为什么会这样。
最直接的控制是通过 git prune
, git repack
, and git prune-packed
. Running git gc
运行 所有这些,甚至更多。假设 git prune
,甚至 git gc --prune=now
会起作用的主要问题是现在无法访问的对象可能已被 打包。
一般来说,您应该首先使引用日志过期,因为删除过期的引用日志条目可能会导致对象无法访问。使用 git gc
以相对安全的方式以正确的顺序完成所有这些操作:首先过期引用日志,然后是 p运行e(小心),然后重新打包,然后是 p运行e-打包。 prune
步骤抛出 松散 未引用的对象 并且它们自己已过期 。1 之后,其他步骤重新打包正在使用的旧对象,并删除刚刚打包的对象。
这一系列事件就是为什么我们需要 git repack -d
,甚至 -ad
,然后是 git prune-packed
。但是,如果某些包标有 .keep
文件,则这些包将保留,如果它们包含其他未引用的对象,则这些对象也将保留。
1由于多个 Git 命令可能是 运行 并行的,明智的做法是提供一个宽限期,在此期间未引用的对象继续存在,以防万一他们即将成为参考。请注意,插入默认的 14 天宽限期的是 git gc
; git prune
默认为 --expire=now
而不是 --expire=2.weeks.ago
。这给 Git 命令 336 小时来完成他们的工作和巩固参考:例如,git commit
运行s git write-tree
后跟 git commit-tree
,以及这棵树和提交未被引用,直到 git commit
也更新当前分支名称。正常情况下,整个过程只需要几毫秒,所以336小时应该足够了。