如果我从一个本地的mercurial repo开始,我认为它是“主要”回购(原谅我的dvcs领主),并打算使用bitbucket作为备份和问题跟踪工具,我可以做我所做的所有更改在我的本地仓库中,执行“hg push”将更改发送回bitbucket。
我是否需要在本地计算机上使用“hg push”命令运行“hg push”?
答案 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
命令push
和pull
在存储库之间移动更改,update
和commit
在您的工作副本和本地存储库之间移动更改。
因此,如果您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更新。将数据推送到本地存储库时,将使用更新,并且您正在从本地存储库推送。