我在化石库中添加了一个文件目录,但是:
所以现在我发现自己的存储库比包含从未有用的文件需要的存储库大一个数量级。 整个目录已包含在单个提交中,在该提交中没有其他任何操作,并且从那以后从未修改过,但之后我不得不做其他提交(在对化石更有信心之后,我知道我可以使用<在做任何其他事情之前强烈>撤消,但当时我并没有意识到这一点。)
我发现完成这项工作的唯一方法是对数据执行避免删除它们,但我也在网上发现此操作可能会对数据库造成严重破坏。鉴于这是一个与工作相关的存储库,我担心造成损害。
有没有办法摆脱那些安全且不会使数据库处于损坏/完全警告状态的文件?
答案 0 :(得分:5)
如果错误的签入仅存在于您的存储库(或您的存储库和服务器)中并且未被其他用户提取,则最简单的解决方案是使用fossil purge
。
使用fossil purge checkins <tag>
将这些签到移动到“墓地”; <tag>
部分也可以是签到的哈希,而不仅仅是符号标记。请注意,如果指定分支,则将清除整个分支;即使您没有指定分支,也会清除签入的所有后代(因为它们依赖于它)。一旦确认一切正常,如果需要释放磁盘空间,请使用fossil purge obliterate
删除坟墓场。如果你不需要磁盘空间,你可以让墓地坐一会儿,直到你确定一切正常。有关更多选项,请参阅fossil help purge
。
您可能希望保留存储库的备份(它只是一个文件,您可以复制它),以防万一有些事情不对。
shunning机制仅用于全局清除工件,并且意味着在中央服务器上作为最后的手段使用:它将阻止这些工件再次通过该服务器传播给其他用户。如果您的更改仅限本地更改,或者您可以访问所有服务器并且可以使用fossil purge
,则不需要回避。
如果您确实需要在分支中间清除某些内容,则需要执行其他步骤。
fossil update
移动到有缺陷的签到之前的签到。fossil merge --cherrypick
复制第一个“好”签到。请fossil commit --allow-fork
提交该签入的副本;编辑器应预填充原始提交消息。系统将提示您确认不想更改提交消息。按“y”。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
从存储库中的当前位置重播commit1
到commitn
。显然,用实际的提交哈希值替换commit1
等。