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

  • 包含的文件占用的空间比我预期的要多
  • 后来我意识到添加它完全是多余的。

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

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

    有没有办法摆脱那些安全且不会使数据库处于损坏/充满警告状态的文件?

    最佳答案

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

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

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

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

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

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

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

    步骤 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 从存储库中的当前位置通过 commit1 重放 commitn。显然,用实际的提交哈希替换 commit1 等。

    关于version-control - 避免化石中的整个提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42832992/

    10-13 09:03