是否有任何理由不将 'git fetch' 设置为始终使用 --prune 选项?

Is there any reason to not set 'git fetch' to always use the --prune option?

使用git fetch --prune 在远程机器上的分支被删除时删除本地远程跟踪分支。使用以下命令将 remote.origin.prune 设置为 true...

git config --global fetch.prune true

...使得使用 fetch 命令总是隐含地使用 --prune 选项。

我正在为我组中一些不太熟悉它的开发人员整理 best-practices/introduction 到 git。在建议他们这样做之前,我想确定我知道这不是一种危险的行为。如果有一些无关紧要的事故,我至少会提醒他们注意什么。

这似乎不是破坏性操作,因为它不会删除任何本地(非远程)分支。这似乎也是一个很好的方法,可以在不定期指定 git fetch --prune 或 git remote prune 的情况下不构建不再使用的遥控器。

如果这一切都是真的,为什么这不是 git 的默认行为?

它从根本上来说并不危险,我一直想在自己的 --global 设置中设置它,但我从来没有这样做过:主要是因为它对我的价值也相对较小。1

正如您所注意到的,其目的实质上是在 origin 上不再存在分支 zorg 后删除 origin/zorg。因为这对你自己没有直接影响 zorg,如果你有一个,它通常是无害的,并且会破坏你对远程跟踪分支的看法。仅有的两个可能的缺点是:

  1. 如果某人错误地删除了上游存储库中的zorg,并且所有下游副本都删除了它们的origin/zorg,您将失去作为上游存储库中 zorg 提示的提交(可能还有许多提交本身)的 ID。所以它放大了一些错误的影响。 (当然,如果上游存储库那么重要,您可能无论如何都应该进行备份——尽管如果您选择使用克隆作为备份,自动修剪有一个缺点。当然,您始终可以专门针对这些禁用自动修剪备份。)

  2. 假设您有自己的zorg跟踪origin/zorg,并且上游zorg被删除(这次是故意的)。请注意,正是您的 origin/zorg 为您提供了 git status 信息,告诉您在 origin/zorg 之前有多少次提交。假设您现在想要 移动 这些提交,但不将使用到上游的提交移动到您自己的另一个分支。在这种情况下,自动修剪你自己的 origin/zorg 使得很难判断哪些提交是你的,哪些已经在上游。

请注意,在情况 2 中,您不会丢失任何提交。你失去的是判断能力,例如,只有 最后三个 当前在你的 zorg 上提交是你自己的,之前有几个(不在任何其他现在分支)最初在 origin/zorg.


1这些年来,修剪代码有时会有些问题,主要是修剪失败。这意味着 Git 开发人员自己可能不会经常使用它(但现在情况应该更好,因为现在 Git 的内部测试套件中有测试以确保修剪在新的环境中正常工作发布)。所以在 "low value" 和 "insufficient testing in the past" 之间,至少在当时,这是不设置它的充分理由。