16

如果我从本地 mercurial 存储库开始,我认为它是“主要”存储库(请原谅我的 dvcs 领主),并打算使用 bitbucket 作为备份和问题跟踪工具,我可以在本地进行所有更改repo 并执行“hg push”以将更改发送回 bitbucket。

我不需要使用“hg update”在我的本地机器上运行这个“hg push”命令吗?

4

4 回答 4

38

你为什么要关心 BitBucket 服务器工作目录中的内容?只要您推送更改,更改就会在存储库中并在 BitBucket 页面上可见。

编辑:好的,我将把它编辑成一个有用的答案。

假设您克隆了我的一个存储库,例如 BitBucket 上的 django-hoptoad。您将django-hoptoad在本地计算机上命名一个文件夹,其内容如下所示:

django-hoptoad/
 |
 +-- .hg/
 |
 +-- ... my code and other folders

有关存储库本身的所有数据都存储在该.hg/文件夹中。这就是 Mercurial 保存有关哪些文件在哪些变更集中进行了更改以及许多其他内容的数据的地方。

你可以这样想(尽管它过于简单化了):

django-hoptoad/
 |
 +-- .hg/
 |    |
 |    +-- data about changeset 1
 |    +-- data about changeset 2
 |
 +-- ... my code and other folders as they appear in changeset 2

当您运行hg pull并且不更新时,您将任何新的变更集拉入存储库:

django-hoptoad/
 |
 +-- .hg/
 |    |
 |    +-- data about changeset 1
 |    +-- data about changeset 2
 |    +-- data about changeset 3 (NEW)
 |    +-- data about changeset 4 (NEW)
 |
 +-- ... my code and other folders as they appear in changeset 2

如果您不更新,... my code and other folders则 仍将等同于 中的任何内容changeset 2,但其他变更集仍在存储库中。

当您运行hg updateMercurial 时,将更新... my code and other folders为最新变更集的内容。

django-hoptoad/
 |
 +-- .hg/
 |    |
 |    +-- data about changeset 1
 |    +-- data about changeset 2
 |    +-- data about changeset 3
 |    +-- data about changeset 4
 |
 +-- ... my code and other folders as they appear in changeset 4

实际上,这意味着发生的内容... my code and other folders不必与存储库中的内容相匹配。您可以删除它,所有变更集仍将在存储库中:

django-hoptoad/
 |
 +-- .hg/
      |
      +-- data about changeset 1
      +-- data about changeset 2
      +-- data about changeset 3
      +-- data about changeset 4

如果您现在提交,它将创建一个基本上说“无文件”的新变更集。不过,您不必承诺。人们仍然可以向您推送和拉取信息,因为存储库仍然包含有关变更集的所有数据。

这几乎可以肯定是 BitBucket 正在做的事情。你永远不会登录到 BitBucket 的服务器,编辑你的代码并在那里提交——你只会推送/拉取/克隆。这意味着... my code and other folders永远不会真正使用它,所以我想 Jesper 已经将它设置为删除它以节省磁盘空间。

由于只真正影响工作目录,而BitBucket上的工作目录从来没有使用过,所以你push到BitBucket后就hg update不需要运行了。hg update

于 2009-07-27T14:59:47.220 回答
12

我认为您可能会对工作副本(又名工作目录)和本地存储库感到困惑。这些是相关但独立的事物。本地存储库包含所有跟踪文件的完整历史记录,而工作副本包含来自特定修订的文件版本以及您对它们的更改,

hg命令pushpull移动存储库之间的更改以及和update移动commit工作副本和本地存储库之间的更改。

因此,如果您push更改不会更改本地存储库的远程存储库,则无需在本地存储库update运行。但是,任何使用远程存储库的人都需要这样做,update以便您的更改显示在他们的工作副本中。相反,如果您pull从远程存储库进行更改,则需要执行操作,update以便这些更改显示在您的工作副本中。

同样,您需要将commit工作副本中的所有更改都放入本地存储库,然后才能使用push.

于 2009-07-27T12:29:39.107 回答
7

Bitbucket 向您显示存储库。正如 Dave Webb 所指出的,hg update关注更新工作副本。当您这样做时,hg push您正在传输变更集以更新 Bitbucket 上的存储库——因此 Web 界面将显示这一点。

正如 Steve Losh 所指出的,Bitbucket 上没有工作副本。也没有hg update在你背后做任何事情。

您可以通过在没有工作副本的情况下进行克隆来自己试验:

% hg clone --noupdate repo repo-empty

然后进去repo-emptyhg log。您会看到即使那里没有文件,历史记录(即存储库)仍然被克隆。您可以使用以下hg update命令显示文件:

% hg update

并再次消失

% hg update null

仅当您想查看文件并进行新提交时才需要工作副本。否则,您可以将其删除以节省空间。这通常在仅用于服务的克隆中完成,hg serve或者与 Bitbucket 使用的等效事物一起使用。

于 2009-07-27T21:48:26.417 回答
0

无需在本地计算机上进行 hg 更新。当数据被推送到本地存储库时使用更新,并且您正在从本地存储库推送。

于 2009-07-27T12:20:35.670 回答