Mercurial:为什么拉式变更集不公开?

Mercurial:为什么拉式变更集不公开?,mercurial,Mercurial,考虑以下情况: $ md repo1; cd repo1 $ echo some data > myfile $ hg init; hg addremove; hg commit -m "First commit." adding myfile myfile committed changeset 0:32c7aa047f3b $ hg serve listening at http://vostro.rath.org:8000/ (bound to *:8000) 然后在另一个终端:

考虑以下情况:

$ md repo1; cd repo1
$ echo some data > myfile
$ hg init; hg addremove; hg commit -m "First commit."
adding myfile
myfile
committed changeset 0:32c7aa047f3b
$ hg serve
listening at http://vostro.rath.org:8000/ (bound to *:8000)
然后在另一个终端:

$ hg clone http://vostro.rath.org:8000/ repo2
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
updating to branch default
resolving manifests
getting myfile
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ cd repo2; hg phase tip
0: public
..在第一个终端中:

127.0.0.1 - - [25/May/2013 16:38:40] "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
^Cinterrupted!
$ hg phase tip
0: draft
在我看来,这是非常错误的。有人刚刚从第一个存储库中提取了变更集,因此它显然是公共的。但是,它在存储库中仍然显示为草稿

有人能解释一下这种行为的原因吗?作为第一个存储库的所有者,我非常想知道何时有人进行了修订,例如,我不再对其重新定基,因此我认为如果hg服务器进程将相应地更新阶段,这将是明智的

pull的目的不是更改远程存储库阶段,而是更改本地存储库的阶段

需要明确的是,您不应该关心远程存储库的哪个阶段

甚至更多的远程存储库可能使用不支持阶段的旧mercurial版本托管

为什么会有这种行为

因为阶段仅对本地存储库有意义,并且有助于防止历史记录修改错误。

pull的目的不是更改远程存储库阶段,而是更改本地存储库的阶段

需要明确的是,您不应该关心远程存储库的哪个阶段

甚至更多的远程存储库可能使用不支持阶段的旧mercurial版本托管

为什么会有这种行为

因为阶段只对本地存储库有意义,并且有助于防止历史修改错误。

正如@zerkms所说,pull并不打算更改远程存储库

如果您的工作存储库被用作服务器,您有几个选项:

将默认的提交设置为公共而不是草稿。其他人可以在任何时候拉,所以只要假设他们是公开的。 将提交的默认值设置为secret。其他人将无法拉动它们。当您准备好共享时,将它们设置为公共。 将存储库设置为非发布。其他人可以提取您的草稿变更集,但它们仍将标记为草稿。 下面介绍如何在mercurial.ini/hgrc中指定这些行为

正如@zerkms所说,pull并不打算更改远程存储库

如果您的工作存储库被用作服务器,您有几个选项:

将默认的提交设置为公共而不是草稿。其他人可以在任何时候拉,所以只要假设他们是公开的。 将提交的默认值设置为secret。其他人将无法拉动它们。当您准备好共享时,将它们设置为公共。 将存储库设置为非发布。其他人可以提取您的草稿变更集,但它们仍将标记为草稿。 下面介绍如何在mercurial.ini/hgrc中指定这些行为


你可能会在邮件列表中得到更好的答案,但我的理解是:

hgpull始终是一个只读命令,可以在没有对远程存储库的写访问权限的情况下运行。更改远程存储库中的阶段显然需要写入。另一方面,hgpush总是写入远程存储库,因此阶段没有引入任何更改

将hg pull从只读更改为读写可能会导致一些人的工作流程中断,这是mercurial开发中的一个致命的罪过。例如,一个匿名用户从公共服务器拉取,通过电子邮件包发回更改

基本上,这是一个历史怪癖,因为阶段是一个复古适合

这留下的漏洞是,变更集的原始所有者可以对其进行修改,而不必意识到变更已经进入了野生状态。我想这个漏洞不会让太多人担心,因为正在开发的变更集演化功能以更好的方式解决了这个问题

我倾向于认为这些阶段是:

公共-公共可见且不可变 草稿-公开可见和可变 秘密-不公开可见且不可更改
我认为草稿之所以存在,是因为它基本上是我们在添加阶段之前的状态,并且是一个有点弱的概念。真的,如果你的工作环境中人们可能会直接从你那里获取信息,那么我建议你更多地使用公开和秘密阶段,并避免草稿。

你可能会在邮件列表中得到更好的答案,但我的理解是:

hgpull始终是一个只读命令,可以在没有对远程存储库的写访问权限的情况下运行。更改远程存储库中的阶段显然需要写入。另一方面,hgpush总是写入远程存储库,因此阶段没有引入任何更改

将hg pull从只读更改为读写可能会导致一些人的工作流程中断,这是mercurial开发中的一个致命的罪过。例如,一个匿名用户从公共服务器拉取,通过电子邮件包发回更改

基本上,这是一个历史怪癖,因为阶段是一个复古适合

这留下的洞是它的原始所有者 变更集可以对其进行修改,而不必意识到变更已进入疯狂状态。我想这个漏洞不会让太多人担心,因为正在开发的变更集演化功能以更好的方式解决了这个问题

我倾向于认为这些阶段是:

公共-公共可见且不可变 草稿-公开可见和可变 秘密-不公开可见且不可更改
我认为草稿之所以存在,是因为它基本上是我们在添加阶段之前的状态,并且是一个有点弱的概念。真的,如果您的工作环境是人们可能直接从您那里获取信息,那么我建议您更多地使用公开和秘密阶段,并避免使用草稿。

将我视为远程存储库的所有者。我非常关心这个阶段,因为我不想在有人拉了东西之后改变历史。NikSt:NekRe:考虑到你是远程存储库的所有者:A被错误地克隆了,克隆被删除了。B有了阶段的改变,而你有自己的上游仓库,并且应该依赖它。不是你的客户。把我当成远程仓库的所有者。我非常关心这个阶段,因为我不想在有人拉了东西之后改变历史。NikSt:NekRe:考虑到你是远程存储库的所有者:A被错误地克隆了,克隆被删除了。B有了阶段的改变,而你有自己的上游仓库,并且应该依赖它。你所说的一切都是正确的,但它并没有回答这个问题:不改变远程存储库的理由是什么?“在我看来,这种选择似乎只有缺点。”泽克姆斯在他的回答和评论中解释了理由。我在扩展如何使用它。您所说的一切都是正确的,但它没有回答以下问题:不更改远程存储库的理由是什么?“在我看来,这种选择似乎只有缺点。”泽克姆斯在他的回答和评论中解释了理由。我在扩展你能做些什么来处理它。
[phases]
publish = False
new-commit = public