【问题标题】:'hg strip' created patch is corrupt'hg strip' 创建的补丁已损坏
【发布时间】:2010-11-29 13:11:56
【问题描述】:

我使用hg strip 从我的历史记录中删除了一些提交。 现在我想重新应用在 strip 命令期间作为备份制作的补丁:.hg/strip-backup/68a8f24f62d0-backup.hg

不幸的是,当我尝试推送补丁时,补丁似乎已损坏:

$:~/sc2$ hg init --mq
adding .hg/patches/68a8f24f62d0-backup.hg
68a8f24f62d0-backup.hg: up to 582 MB of RAM may be required to manage this file
(use 'hg revert 68a8f24f62d0-backup.hg' to cancel the pending addition)
$:~/sc2$ hg qpush
applying 68a8f24f62d0-backup.hg
patch 68a8f24f62d0-backup.hg is empty
transaction abort!
rollback completed
cleaning up working directory...done
abort: decoding near 'h91AY&SY݁��S������': 'utf8' codec can't decode byte 0xb1 in position 16: invalid start byte!

有人已经遇到过这个问题,或者可以给我建议如何应用补丁吗?如果不可能的话,我就完蛋了……

也许这是一个python问题?

我尝试了 hg unbundle 并得到了这个:

adding changesets
adding manifests
adding file changes
transaction abort!
rollback completed
abort: received file revlog group is empty

如果我做 hg pull:

pulling from 68a8f24f62d0-backup.hg
searching for changes
adding changesets
transaction abort!
rollback completed
abort: data/sc2-local.tar.i@2cad29d699f8: no node!

那么如何解决节点问题呢?

海因里希

【问题讨论】:

  • AFAIK 命令 hg unbundle 用于恢复由 strip 命令创建的备份 - 请参阅 hg help strip 的输出。
  • 对我来说,一个解决方案是从捆绑包中获取“健康”文件,然后我可以将它们再次合并到我的工作副本中。问题是我找不到获取内容的命令!
  • 可能文件确实已损坏。要找到实际问题,使用--debug 选项在此文件上运行hg 命令可能会很有用。如果你运行 hg --debug -R <bundle-file> log 会发生什么?
  • 捆绑包不是您可以直接操作的东西——它们不是存档文件。你hg pull path/to/bundle使用它。

标签: python mercurial utf-8 tortoisehg


【解决方案1】:

来自hg help strip的输出:

任何剥离的变更集都存储在“.hg/strip-backup”中......它们可以通过运行“hg unbundle .hg /strip-backup/BUNDLE”来恢复,其中 BUNDLE 是由条带。

这个简单的演示会话说明了 stripunbundle 命令的使用:

# create a new repo and commit some changes:
$ hg init foobar
$ cd foobar/
$ echo a > file
$ hg ci -A -m "Initial"
adding file
$ echo b > file
$ hg ci -m "Change 1"
$ echo c > file
$ hg ci -m "Change 2"
$ hg glog --template '{rev} - {node} - {desc}\n'
@  2 - 86ecd06a38260fd229fdd73ba82efa6b2db0784c - Change 2
|
o  1 - 7827b4d5a10c2ca8d5196752f1b2dec92e8cf573 - Change 1
|
o  0 - 2b41b1e661196fe943125fdb1d590b5a60369c7e - Initial

# trash revision 1 and all its children:
$ hg strip 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
saved backup bundle to /path/to/foobar/.hg/strip-backup/7827b4d5a10c-backup.hg
$ hg log --template '{rev} - {node} - {desc}\n'
@ - 2b41b1e661196fe943125fdb1d590b5a60369c7e - Initial

# meanwhile, make new changes:
$ hg ci -m "Change 1.1"
$ hg glog --template '{rev} - {node} - {desc}\n'
@  1 - a5ad2a79835ad0019f215e62fd928f8649cbbcab - Change 1.1
|
o  0 - 2b41b1e661196fe943125fdb1d590b5a60369c7e - Initial

# you decide your previous work was not that bad at all:
$ hg unbundle .hg/strip-backup/7827b4d5a10c-backup.hg
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files
(run 'hg update' to get a working copy)

$ hg glog --template '{rev} - {node} - {desc}\n'
o  3 - 86ecd06a38260fd229fdd73ba82efa6b2db0784c - Change 2
|
o  2 - 7827b4d5a10c2ca8d5196752f1b2dec92e8cf573 - Change 1
|
| @  1 - a5ad2a79835ad0019f215e62fd928f8649cbbcab - Change 1.1
|/
o  0 - 2b41b1e661196fe943125fdb1d590b5a60369c7e - Initial

【讨论】:

  • 感谢您的帮助!不幸的是,我无法毫无错误地执行 unbundle,请参阅上面的帖子。
【解决方案2】:

我与 Matt Mackall(Mercurial 的主要作者)就这个话题进行了一些接触,我们发现了 Mercurial 中的一个错误:

Mercurial 实际上无法处理大于 2^31-1 字节(约 2GB)的文件,因为有符号整数用于保存大小。但是,如果您添加较大的文件(我所做的),mercurial 不会拒绝它们,而是照常添加。文件大小的唯一检查似乎是在推送到服务器时。但是,我在这里只收到一个警告和一个永无止境的hg push

Matt Mackall 从邮件对话中引用:

它会导致在几个溢出 地点:

a) 在编写第一个修订版时 revlog,我们将存储一个 未压缩大小以 2G 为模,但我们会 仍然能够成功读取 整个文件

b) 构建捆绑包时 传输或剥离,我们将 报告一个以 2G 为模的块大小,其中 将被解释为否定 数字,因此看起来像一个空的 块。

【讨论】:

  • 我认为你必须承认跟踪 2GB 文件不是正常的版本控制使用。您的存储库将是巨大的,这里稍作修改,那里稍作修改。
  • 当您添加该文件时,没有反复发出关于添加太大文件的大警告?它曾经用于超过 10MB 的任何东西,我认为它被提高了但没有被淘汰。
  • 当然,添加 3G 文件没有意义,这就是我想使用 strip 的原因!
  • 我也没有收到 hgtk 的警告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2013-08-11
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多