提交和推送单个文件最简单的方法是什么?

我对Mercurial来说比较陌生,现在我的团队正在尝试使用它来取代Subversion。

我怎么能提交并推送一个文件到另一个存储库,而我的工作目录中的其他修改未提交(或至less不推送到其他存储库)?

这发生在我们与数据库迁移。 我们希望将迁移提交到源代码pipe理,以便DBA可以查看和编辑它,同时我们正在进行代码修改,以便与数据库迁移一起进行。 这些变化还没有准备好,所以我们不想把所有这些都推出去。

在颠覆,我只是做:

svn add my_migration.sql # commit only the migration, but not the other files I'm working on svn commit -m "migration notes" my_mygration.sql 

并继续在当地工作。

这不适用于mercurial,因为当我推送到另一个存储库,如果有更改,我没有拉下来,它要我拉下来,合并它们,并提交合并到存储库。 合并之后提交不允许你省略文件,所以它强制你提交本地存储库中的所有东西。

最简单的事情是将文件提交到本地存储库,克隆我的本地存储库,从实际存储库中获取任何新的更改,合并它们并提交合并,然后将我的更改推送出去。

 hg add my_migration.sql hg commit -m "migration notes" my_migration.sql cd .. hg clone project project-clone cd project-clone hg fetch http://hg/project hg push http://hg/project 

这个工作,但它感觉像我失去了一些更容易,一些方法来告诉mercurial忽略已经在我的工作目录中的文件,只是做合并,并发送文件。 我怀疑mercurial queues可以做到这一点,但我还没有完全熟悉mq。

感谢下面的Josh Matthews,搁置命令正是我正在寻找的。 我没有看到任何与谷歌search一起伟大的安装说明,所以这里是我用它来工作的组合的东西:

获取它:

 hg clone http://freehg.org/u/tksoh/hgshelve/ hgshelve 

该项目中唯一的文件(当前)是hgshelve.py文件。

修改你的〜/ .hgrc来添加货架扩展名,指向你克隆repo的地方:

 [extensions] hgshelve=/Users/ted/Documents/workspace/hgshelve/hgshelve.py 

那么你可以暂时hg shelve和暂时保存更改。 它可以让你在“修补程序”层面工作,挑选要搁置的物品。 它似乎没有搁置一个文件已经列出添加,只有文件已经在修改回购。

有一个Mercurial扩展实现了搁置和非搁置的命令,这给你一个交互的方式来指定更改存储,直到以后的时间: Shelve 。

我原来提出这个问题已经快2年了。 现在我会做不同的事情(正如我在上面的问题中提到的那样)。 我现在要做的是将我的更改提交到我的本地回购中的一个文件(可以使用hglogging扩展来只提交一个文件):

 hg commit -m "commit message" filename 

然后推出。

 hg push 

如果有冲突,因为我已经对回购协议进行了其他更改,我需要首先进行合并,我会更新到父版本(如果您不知道它是什么,请参阅“hg parents -r。”),提交我的其他变化,所以我有2个头。 然后恢复到原来的单个文件提交并将更改拉入/合并到该版本中。 然后推出更改

 hg push --rev . 

只推出单个文件和该修订版本的合并。 那么你可以合并你在本地的两个头。

这种方式摆脱了mq的东西和被拒绝的可能性,并保持一切由源代码pipe理。 如果您稍后决定不需要,也可以将“hg strip”修订版closures。

tl; dr:我原来的解释看起来很复杂,但我希望能够完整地解释如何使用补丁队列。 这是简短的版本:

 $ hg qnew -m "migration notes" -f migration my_migration.sql $ hg qnew -f working-code # make some changes to your code $ hg qrefresh # update the patch with the changes you just made $ hg qfinish -a # turn all the applied patches into normal hg commits 

Mercurial Queues使得这种事情变得轻而易举,并且可以对变更集进行更复杂的操作。 这是值得学习的。

在这种情况下,首先你可能想要保存当前目录中的内容,然后再下拉更改:

 # create a patch called migration containing your migration $ hg qnew -m "migration notes" -f migration.patch my_migration.sql $ hg qseries -v # the current state of the patch queue, A means applied 0 A migration.patch $ hg qnew -f working-code.patch # put the rest of the code in a patch $ hg qseries -v 0 A migration.patch 1 A working-code.patch 

现在让我们在工作代码上做一些额外的工作。 我要继续做qseries事情,但是一旦你build立了一个补丁队列的心理模型,你就不必再qseries了。

 $ hg qtop # show the patch we're currently editing working-code.patch $ ...hack, hack, hack... $ hg diff # show the changes that have not been incorporated into the patch blah, blah $ hg qrefresh # update the patch with the changes you just made $ hg qdiff # show the top patch's diff 

由于您的所有工作都已保存在修补程序队列中,因此您可以取消应用这些更改并在引入远程更改后将其恢复。 通常情况下,不要应用所有的补丁,只需要hg qpop -a 。 只是为了显示对补丁队列的影响,我将一次popup一个。

 $ hg qpop # unapply the top patch, U means unapplied $ hg qseries -v 0 A migration.patch 1 U working-code.patch $ hg qtop migration.patch $ hg qpop $ hg qseries -v 0 U migration.patch 1 U working-code.patch 

在这一点上,就好像你的目录没有改变。 做hg fetch 。 现在,您可以重新启动修补程序队列更改,并在发生冲突时将其合并。 这在概念上有些类似于git的rebase。

 $ hg qpush # put the first patch back on $ hg qseries -v 0 A migration.patch 1 U working-code.patch $ hg qfinish -a # turn all the applied patches into normal hg commits $ hg qseries -v 0 U working-code.patch $ hg out migration.patch commit info... blah, blah $ hg push # push out your changes 

此时,您推出了迁移,同时保留其他本地更改。 您的其他更改位于队列中的修补程序中。 我使用补丁队列来完成我个人的大部分开发工作,以帮助我更好地构build自己的更改。 如果你想摆脱修补程序队列,并返回到正常的风格,你将不得不导出你的更改,并重新导入“正常”的mercurial。

 $ hg qpush $ hg qseries -v 0 A working-code.patch $ hg export qtip > temp.diff $ rm -r .hg/patches # get rid of mq from the repository entirely $ hg import --no-commit temp.diff # apply the changes to the working directory $ rm temp.diff 

我非常沉迷于补丁队列的发展和mq是最好的实现之一。 同时进行多个更改的能力确实可以改善提交的重点和清洁程度。 这需要一段时间才能适应,但是对于DVCS工作stream程来说,这一点非常好。

如果您不想依赖扩展,另一个select是在本地保留上游存储库的克隆,只用于这些types的集成任务。

在您的示例中,您可以简单地将更改合并到上游存储库,然后将其直接推送到远程服务器。

我通常使用的是使用提交一个文件:

  hg commit -m "commit message" filename 

以后的情况下,我有合并冲突,我还没有准备好提交我的更改,请按照下列步骤操作:

1)创build一个补丁文件。

 hg diff > changes.patch 

2)只有在检查了您的补丁文件后,才能恢复所有未完成的未完成更改。

 hg revert --all 

3)拉,更新和合并到最新版本

 hg pull -u hg merge hg commit -m "local merge" 

4)现在只需导入您的补丁,并获得您的更改。

 hg import --no-commit changes.patch 

记住从自动提交更改中使用-no-commit标志。