【问题标题】:bitbucket, "hg push" and "hg update"bitbucket、“hg push”和“hg update”
【发布时间】:2010-11-14 08:14:44
【问题描述】:

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

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

【问题讨论】:

  • 我想我解释得不够好。我在本地机器上进行编码。满意后,我在本地机器上执行“hg commit”。到目前为止一切都很好,但现在 bitbucket 在图片中。所以我“hg push”到bitbucket。那么我不需要在 bitbucket 上“hg update”吗?如果是,我该怎么做?

标签: mercurial dvcs bitbucket


【解决方案1】:

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

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

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

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

【讨论】:

  • 因此,如果您将更改推送到不会更改本地存储库的远程存储库,因此无需运行更新。我将更改推送到远程存储库,其中这个案例是我的 bitbucket 回购。那么我是否还需要以某种方式在 bitbucket 上进行“hg update”?如果是,如何?如果不是,为什么?
  • 您需要对 bitbucket 进行更新,以便您的存储库中的更改反映在 bitbucket 的工作副本中。我认为您只能通过在本地为 bitbucket 存储库运行“hg update”来做到这一点。我已经更新了答案以反映这一点。
  • 当然你不会对bitbucket进行更新。该工作副本有什么用途?没错,根本没有
【解决方案2】:

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

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

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

% hg clone --noupdate repo repo-empty

然后进入repo-empty 并执行hg log。您会看到,即使那里没有文件,history(即 repository)仍然被克隆。您可以使用hg update 命令使文件出现:

% hg update

然后又消失了

% hg update null

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

【讨论】:

    【解决方案3】:

    您为什么要关心 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

    【讨论】:

    • 这真是让人大开眼界。我知道 Jesper 在 SO 上很活跃。也许我们也会听到他的消息。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2016-12-11
      相关资源
      最近更新 更多