避免对化石的整体承诺

shun a whole commit in fossil

我已经在我的化石库中添加了一个文件目录,但是:

  1. 包含的文件占用的空间比我预期的多space
  2. 后来我才知道加它完全是多余的

所以现在我发现自己的存储库比它需要的存储库大一个数量级来包含从来没有用过的文件。 整个目录已包含在一次提交中,该提交中没有执行任何其他操作,此后从未修改过,但之后我不得不进行其他提交(在对化石更有信心之后,我知道我可以使用 撤消,然后再做其他事情,但当时我并没有意识到这种可能性。

我发现完成这项工作的唯一方法是对数据执行回避以删除它们,但我还在网上发现此操作会对数据库造成严重破坏。鉴于这是一个与工作相关的存储库,我担心会造成损害。

有没有办法删除那些安全且不会使数据库处于 corrupted/full 警告状态的文件?

如果错误签入仅存在于您的存储库(或您的存储库加服务器)并且未被其他用户拉取,最简单的解决方案是使用 fossil purge.

使用 fossil purge checkins <tag> 将签到移动到 "graveyard"; <tag> 部分也可以是签入的哈希值,而不仅仅是符号标记。请注意,如果您指定一个分支,则整个分支将被清除;即使您没有指定分支,签入的所有后代也将被清除(因为它们依赖于它)。确认一切正常后,如果需要释放磁盘 space,请使用 fossil purge obliterate 清除墓地。如果您不需要磁盘 space,您可以让墓地闲置一段时间,直到您确定一切正常。有关更多选项,请咨询 fossil help purge

您可能需要保留存储库的备份(它只是一个文件,您可以复制它),以防出现问题。

回避机制的存在只是为了在全球范围内清除工件,并且作为最后的手段在中央服务器上使用:它将防止这些工件通过该服务器再传播给其他用户。如果您的更改仅在本地,或者如果您可以访问所有服务器并且可以使用 fossil purge,则无需回避。


如果您确实需要清除分支中间的某些内容,则需要额外的步骤。

  1. 备份存储库文件,因为您要对其进行重要的手术。
  2. 使用 fossil update 移动到有缺陷的之前的签到。
  3. 使用fossil merge --cherrypick复制第一个"good"签到。执行 fossil commit --allow-fork 以提交该签入的副本;编辑器应该预先填充原始提交消息。系统将提示您确认您不想更改提交消息。按 "y".
  4. 对所有剩余的 "good" 签到重复步骤 3 (fossil merge --cherrypick + fossil commit)。这些你不需要 --allow-fork

您现在应该有一个包含您要保留的所有签入的分叉,以及一个包含错误签入和良好签入的原始版本的单独分叉。验证 fossil ui 中的图表以查看一切是否正常。完成后,使用 fossil purge 删除错误签入及其后代,如上所述。

步骤 3+4 中的过程可以使用 shell 脚本自动执行:

#!/bin/sh
set -e
for commit in "$@"; do
  fossil merge --cherrypick "$commit"
  echo yes | VISUAL=true fossil commit --allow-fork
done

将其放入文件中,例如 fossil-replay.sh,使其可执行,然后使用 fossil-replay.sh commit1 commit2 ... commitn 从存储库中的当前位置重播 commit1commitn。显然,用实际的提交哈希替换 commit1 等。