bitbucket,“hg push”和“hg update”

时间:2009-07-27 12:16:55

标签: mercurial dvcs bitbucket

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

我是否需要在本地计算机上使用“hg push”命令运行“hg push”?

4 个答案:

答案 0 :(得分: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 update时,Mercurial会将... 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已将其设置为删除它以节省磁盘空间。

由于hg update只影响工作目录,并且从不使用BitBucket上的工作目录,因此在推送到BitBucket后不需要运行hg update

答案 1 :(得分:12)

我认为您可能会在working copy(也就是工作目录)和本地repository之间感到困惑。这些是相关的但是分开的东西。本地存储库包含所有跟踪文件的完整历史记录,而工作副本包含特定修订版本的文件版本以及对它们的更改,

hg命令pushpull在存储库之间移动更改,updatecommit在您的工作副本和本地存储库之间移动更改。

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

同样,您需要commit从工作副本到本地存储库的所有更改,然后才能使用push将其发送到另一个存储库。

答案 2 :(得分:7)

Bitbucket向您展示存储库。正如Dave Webb所指出的那样,hg update关注的是更新工作副本。执行hg push时,您正在传输更改集以更新Bitbucket上的存储库 - 因此Web界面将显示此信息。

正如史蒂夫·洛什所指出的那样,Bitbucket上没有工作副本。背后也没有hg update

您可以通过制作没有工作副本的克隆来自己试验:

% hg clone --noupdate repo repo-empty

然后进入repo-empty并执行hg log。您将看到即使没有文件,仍然克隆了历史(即存储库)。您可以使用hg update命令显示文件:

% hg update

然后再次消失

% hg update null

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

答案 3 :(得分:0)

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