【问题标题】:Mercurial: get fresh copyMercurial:获取新鲜副本
【发布时间】:2011-03-23 14:00:59
【问题描述】:

我有一个本地存储库,我想从远程存储库获取最新更改。我知道我可以克隆,但克隆只适用于新目录。我知道我可以删除本地存储库,然后克隆,但我想知道如果有的话,如何使用 Mercurial 方式。

编辑:如果有冲突,hg pull -u 不起作用。我不想解决冲突,我只想获取远程仓库的新副本,而不管本地更改如何。

回答:简短回答:也许可以做到(见下面的回答),但重新克隆更容易。

长答案:如果您想从远程获取最新信息而忽略本地更改和提交,那么您必须克隆到新的本地存储库或删除本地存储库并克隆另一个存储库。这是因为如果您有冲突的更改,那么 hg 将强制您手动解决它们。

这没关系,但我只是想知道是否可以在不删除本地存储库的情况下完成。

【问题讨论】:

  • 你肯定需要阅读hginit.com
  • 在决定发布问题之前,我阅读了文档 2 小时。感谢您的链接。

标签: mercurial


【解决方案1】:

我想你只是在寻找这个:

hg pull
hg up --clean

这将从远程存储库中提取最新的修订集,然后使用干净副本更新您的本地存储库,无论您是否对文件进行了任何更改。无需合并。

唯一需要注意的是,如果您已将文件添加到本地存储库,但它们尚未提交,则它们将在更新后成为孤立的(留在原地,但不在存储库中)。如果您执行hg stat,您应该看到它们用问号表示。如果添加的文件已提交到您的本地存储库,Mercurial 将在它们之后正确清理。

这是远程存储库(远程版本 6):

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         3/24/2011   2:16 PM            .hg
-a---         3/24/2011   2:16 PM         83 addedtoremote.txt
-a---         3/24/2011   1:56 PM        726 sample.txt    

这是本地存储库(从之前的远程版本 4 克隆),其中包含更改和添加的文件(本地版本 5):

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         3/24/2011   2:03 PM            .hg
-a---         3/24/2011   2:05 PM          9 sample.txt
-a---         3/24/2011   2:05 PM         58 addedtolocal.txt

这是执行拉取和清理更新(本地版本 6)后的本地存储库:

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         3/24/2011   2:17 PM            .hg
-a---         3/24/2011   2:17 PM         83 addedtoremote.txt
-a---         3/24/2011   2:15 PM        726 sample.txt    

sample.txt 的更改已被清除,addedtolocal.txt 已被删除,addedtoremote.txt 已被添加。

【讨论】:

  • 两个版本有冲突我就不行了。
【解决方案2】:

看起来您正在寻找hg strip,它不是 Mercurial 核心的一部分。它可以通过 MqExtension 获得。您可以通过在 .hgrc 或 Mercurial.ini 文件中添加以下内容来启用它 (https://www.mercurial-scm.org/wiki/MqExtension)

[extensions]
mq =

然后你将能够:

hg strip rev

这会将您的变更集删除到您不应该有任何合并冲突的地步。不过,这会影响分支历史。但是话又说回来,这还不错,如果您保留它们,那么任何好的未来变更集都会有一个您决定丢弃的祖先。

如果你只是尝试一些东西,你最好在一个单独的分支中进行,这样以后很容易关闭和放弃。

如果您真的希望保留错误的变更集,您可以像这样将配置选项传递给合并命令

hg --config ui.merge=internal:other merge 

这在Mercurial tips and tricks中有记录。

【讨论】:

  • 我想访问远程仓库,但我只想覆盖我的本地副本。你的建议不起作用,因为如果你有冲突,你最终会得到 2 个头并且仍然需要合并
  • 我想试试 strip 但似乎我必须安装一个扩展。在这一点上,我认为重新克隆更容易,我很好。我将您的标记为答案。谢谢。
  • 正确,但这很容易,我将编辑我的答案以提及扩展和设置。不能在 cmets 中这样做,因为它会丢失它的格式。
  • --config 方式不需要任何扩展。你试过那个吗?我不能说我尝试过并且想知道结果。
  • 遇到了同样的问题,hg clone 对于大型项目来说非常慢 - hg strip 对我有用,谢谢!
【解决方案3】:

只需从远程仓库“拉取”更改。认为“拉”和“推”是 repos 之间的变更集交易。

完成后,您必须“更新”源代码。

【讨论】:

  • hg pull -u 如果有冲突就不起作用。我不想解决冲突,我只想从远程仓库获取新副本。
  • hg pull 将使您从存储库中获取更改,而无需更新当前代码。当您准备好处理冲突时,您将不得不“合并”。我让您阅读文档以了解如何操作。
  • 如果您想放弃自己的更改,请先发出hg revert --all,然后发出hg pull -uhg update(或hg fetch,如果您已启用。)
  • 我相信 hg revert -all 也不起作用,因为我已将更改提交到本地 repo,而 revert 只会删除未提交的更改。
  • @Klaim:对不起,我以为我得到了 RTFMed。似乎没有办法做到这一点。
【解决方案4】:

您可以重新调整您的修改,最大限度地减少合并的需要。只需拨打hg pull --rebase

您必须在您的~/.hgrc 中启用rebase 扩展:

[extensions]
rebase = 

【讨论】:

  • hg pull --rebase 还需要您手动解决冲突。我试了一下,它启动了 diff 工具。
【解决方案5】:

由于这是一种常见的操作,因此有一个扩展程序可以在一个命令中执行 hg pull -uhg mergehg commit

hg fetch

来自hg book

启用 fetch 扩展很容易。 编辑您家中的.hgrc 文件 目录,然后转到 扩展部分或创建一个 扩展部分。然后添加一行 简单地说就是“fetch=”。

[extensions]
fetch =

【讨论】:

  • 好的,谢谢。 -u 实际上进行了更新。我更新了我的答案以澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2016-12-06
  • 2014-07-08
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多