bitbucket,"hg push"和"hg update"

che*_*art 16 mercurial dvcs bitbucket

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

我不需要在我的本地机器上运行"hg push"命令并使用"hg update"吗?

Ste*_*osh 38

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

编辑:好的,我要编辑这个是一个有用的答案.

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

django-hoptoad/
 |
 +-- .hg/
 |
 +-- ... my code and other folders
Run Code Online (Sandbox Code Playgroud)

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

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

django-hoptoad/
 |
 +-- .hg/
 |    |
 |    +-- data about changeset 1
 |    +-- data about changeset 2
 |
 +-- ... my code and other folders as they appear in changeset 2
Run Code Online (Sandbox Code Playgroud)

当您运行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
Run Code Online (Sandbox Code Playgroud)

如果不更新,... 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
Run Code Online (Sandbox Code Playgroud)

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

django-hoptoad/
 |
 +-- .hg/
      |
      +-- data about changeset 1
      +-- data about changeset 2
      +-- data about changeset 3
      +-- data about changeset 4
Run Code Online (Sandbox Code Playgroud)

如果您现在提交,它将创建一个新的变更集,基本上说"没有文件".你不必提交.人们仍然可以推送你,因为存储库仍然包含有关变更集的所有数据.

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

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


Dav*_*ebb 12

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

hg命令pushpull移动存储库之间的变化updatecommit你的工作副本和本地资源库之间移动的变化.

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

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


Mar*_*ler 7

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

正如Steve Losh所指出的那样,Bitbucket没有工作副本.hg update背后也没有做到.

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

% hg clone --noupdate repo repo-empty
Run Code Online (Sandbox Code Playgroud)

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

% hg update
Run Code Online (Sandbox Code Playgroud)

并再次消失

% hg update null
Run Code Online (Sandbox Code Playgroud)

只有在您想要查看文件并进行新的提交时才需要工作副本.否则,您可以将其删除以节省空间.这通常在克隆中完成,这些克隆仅用于服务hg serve或与Bitbucket使用的相同的东西.