如何在Hg中仅推送到一个分支?

56

我有一个Hg仓库,其中包含3个分支,但其中两个是不活动的(因为我已经将它们合并到了默认分支中)。hg heads展示了3个分支的head,即使hg branches将其中2个标记为“inactive”。

当我尝试推送我的默认分支(使用hg push --branch default http://...)到另一个仓库时,合并会被中止,并显示错误信息“abort: push creates new remote branches: !”。

根据Hg push手册,“默认情况下,push不允许在目标仓库创建新的head,因为多个head会令人难以确定要使用哪一个。在这种情况下,建议先拉取和合并再推送。”

我已经做过这个步骤,但我仍然无法推送--branch default而不中止操作。

感谢任何帮助!

3个回答

60

如果默认分支上的更改集有其他分支上的祖先更改集,您还需要推送那些更改集。在存储库中,一个更改集不能存在而它所有的更改集也不存在。

所以请尝试:

hg push --branch default --new-branch

这段话的意思是:“是的,我知道这次推送(Send)会发送一个之前远程仓库没有见过的分支名称”(需要Mercurial 1.6或更高版本)。

此外,你可以通过以下命令将那些不活跃的提交变为已关闭的提交:

hg update thebranch
hg commit --close-branch -m 'closing'

由于“命名分支是永久的”,许多人选择将它们保留用于像“稳定”和“实验性”等长期概念,并使用书签、匿名分支或克隆来处理特性、发布和其他短暂事物。有关这些其他选项的指南,请参见此处


10
你的回答是正确的,但这并不意味着我一定会喜欢它 ;) - simon
2
好的,我完全避免使用命名分支。我是一个克隆作为分支的人。 - Ry4an Brase
7
当然有影响。我使用git的频率比Mercurial高,并且我还有一个.gitconfig文件,需要手动编辑,因为git无法更新它。Mercurial不愿意破坏你的配置文件,但如果你请求,git就会这样做。只要都有记录,它们都是有效的选择。我不知道你链接的那篇文章是谁写的,但那个人可能需要编辑帮助。 - Ry4an Brase
5
这里是 git 文档解释,如果你使用了 includes 功能,git config 命令将无法按预期工作:https://github.com/gitster/git/commit/9b25a0b52e09400719366f0a33d0d0da98bbf7b0。 - Ry4an Brase
2
@bambams,我希望评论可以被踩,这样我就可以踩你的了。 - xyres

38

要推送单个分支,只需使用-b选项

hg push -b myBranch

关于具体问题,您可能想考虑关闭分支。我知道SourceTree提供这个功能,但我不确定具体情况。


1
谢谢,这就是我在寻找的答案。只需推送单个分支即可。 - Sophie McCarrell
2
这是因为你正在推送的分支还没有被推送到服务器上。如果你正在推送一个已存在的分支,那么这个答案就适用。 - dguay

0

你可以强制它!

方法如下:

1. Pull from your repository
2. hg push --rev nnn -f (replace nnn with your Rev # of your working branch)
3. do NOT force before PULLing. if you do things will get out sync and you are screwed

如果您正在使用类似RhodeCode这样的东西,请在强制执行后检查它,您会发现您的最新分支已经存在。

不过我认为以后Mercurial会让你再次推送其他分支,即使您关闭了它,Mercurial也会尝试在服务器上创建该分支。

我也是Git用户,因为客户使用Mercurial而遇到了同样的情况,但我想使用Git工作流风格。

我认为这是可行的,但我还没有完全弄清楚。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接