Fossil SCM - 恢复为Mercurial等特定版本

时间:2014-07-07 15:51:49

标签: version-control fossil

在使用Mercurial时,如果我想用特定版本更改当前的工作副本,我只会这样做:

$> hg revert good_revision
$> hg commit -m "Now I'm in the good revision"

然后我可以看到我的所有文件都在 good_revision 状态,并且可以开始处理它。

到目前为止,在化石上我可以做一个还原,但仅限于特定文件,而不是整个存储库,更新或结帐似乎不像我期望的那样工作。

化石如何将我的整个存储库恢复到某个版本?

3 个答案:

答案 0 :(得分:7)

我不确定我是否完全遵循,但我认为你想要的是能够在Fossil中创建“一个分支上的多个头”。如果是,那么Fossil确实支持这个,只是它将分支的头部称为“离开”,这个过程称为“分叉”。

要做到这一点,你

fossil update good_revision

然后

fossil commit --allow-fork

您现在可以生成fossil ui,导航到您的分支并看到它有两个叶子。

您现在可以关闭当时的叶子。

请注意,虽然支持,但这似乎不是推荐的做法。相反,Fossil建议采用一种特殊的方法来消除变化:

  1. 将“坏”叶子的分支重命名为“错误”(或者如果它尚不存在则创建该分支)。通过这样做,你可以有效地“标记”最终的subleaf是一个错误。

    请注意,名称“错误”名称只是一种惯例;这个分支在新创建的存储库中不存在。

  2. 关闭“坏”叶子。

  3. 使用fossil update返回最后状态,继续黑客攻击。

    由于“最后好”提交仍然继承其父提交的分支标记,因此您记录的下一个提交也将继承它,并且不会在分支“错误”上。

  4. 例如,see how it looks in the SQLite repo - 这个分支上有许多提交的短链提交。另请参阅this

答案 1 :(得分:2)

我认为我理解这个问题的解决方案略有不同(转述:如何处理旧的“good_revision”而不是我称之为bad_leaf的这个分支/主干的当前叶子,并且从“good_revision”开始处理更改“很糟糕”,这相当于在两个版本之间应用差异,但是从/向顺序反向:

使用bad_leaf中的基线而不是默认的最后一个常见提交,从good_revision合并(空)分支;因此,将应用的差异是原始分支与您创建的good_revision分支的差异,因为它不会看到它们已经被应用。使用最新的基线“隐藏”否则会使它忽略所有已经应用的更改。

fossil update good_revision
fossil commit --allow-fork --allow-empty
# note the uuid from that commit (for use as forked_basis below)
fossil merge -f --integrate --baseline bad_leaf forked_basis

然后当然快乐,

fossil commit

它不会创建任何应该被称为“错误”的分支,它只是将从good_revision到bad_leaf的反向差异应用到bad_leaf以使你回到原来的位置,并且你可以继续提交到同样的(新)叶子曾经在bad_leaf。

在原始good_revision的结账时,diff(直接gnu,而不是化石差异)与上述命令匹配后的结账相比较。除了丢失文件的空目录外,化石不会追踪/整理死目录。

警告:我没有长时间使用化石,而且在几个方面与我习惯使用cvs / svn / git / hg / perforce / clearcase的常用方法不同。

添加此答案的原因:我发现现有的答案难以理解,并且不确定我是否相信自己能够正确地理解这些答案。

答案 2 :(得分:2)

如果我正确地理解了您的问题,那么在开发周期的某个地方就会出现问题,您现在想要对已知的良好修订版进行一次或多次修订并开始使用它。此外,您希望该修订版成为您的主干。 Fossil的方法类似于Mercurial:

fossil revert -r good_revision
fossil commit -m "Now I'm in the good revision"

这将使用指定修订版中的文件替换工作目录中的文件。 commit 会将它们提交给你正在处理的任何分支(我假设它是本例中的主干)。如果您未指定修订号,则它将使用上次提交的版本。

revert 命令的一个常见用法是回滚单个文件:

fossil revert  -r good_revision  my_file
    (or)
fossil revert  my_file_from_the_last_commit

但是,如第一个示例所示,省略文件名会导致所有文件都被还原。有关详细信息,请参阅https://www.fossil-scm.org/index.html/help?cmd=revert

对不起最新的回复,但我在寻找其他东西时遇到了问题。我发布这个以防其他人正在研究如何恢复到存储在Fossil中的先前提交的版本。