避免整个化石的承诺

Enr*_*eri 3 version-control fossil

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

  1. 包含的文件占用的空间比我预期的多
  2. 后来我意识到添加它是完全超级的.

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

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

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

Rei*_*nds 5

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

使用fossil purge checkins <tag>这些签入移动到"墓地"; 该<tag>部分也可以是签到的哈希,而不仅仅是符号标记.请注意,如果指定分支,则将清除整个分支; 即使您没有指定分支,也会清除签入的所有后代(因为它们依赖于它).一旦确认一切正常,fossil purge obliterate如果需要释放磁盘空间,请使用摆脱坟墓场.如果你不需要磁盘空间,你可以让墓地坐一会儿,直到你确定一切正常.咨询fossil help purge更多选项.

您可能希望保留存储库的备份(它只是一个文件,您可以只复制它),以防万一有些事情不对.

回避机制仅用于全局清除工件,并且意味着在中央服务器上作为最后的手段使用:它将防止这些工件再次通过该服务器传播给其他用户.如果您的更改只是本地更改,或者您可以访问所有服务器并且可以使用fossil purge,则不需要回避.


如果您确实需要在分支中间清除某些内容,则需要执行其他步骤.

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

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

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

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

把这个在文件中,比如说fossil-replay.sh,使其可执行文件,然后使用fossil-replay.sh commit1 commit2 ... commitn重播commit1通过commitn从信息库中的当前位置.显然,用commit1实际的提交哈希替换等.