如何只推送一部分已提交的文件?

时间:2014-02-26 10:10:13

标签: eclipse mercurial push dvcs

我们最近从svn切换到mercurial。我们使用Aptana作为我们的IDE使用MercurialEclipse插件,使用BitBucket作为我们的存储库,使用SourceTree作为我们的(附加)源代码控制GUI。

我在Aptana中创建了2个新文件,并提交了每个文件。现在,在“同步”视图中,2个文件被列为"传出",我想只推送其中一个。我避免使用"全部推送"顶部的图标将推送所有传出的更改 - 而是右键单击传出列表中的特定文件并选择" push"从上下文菜单中。但是,这会导致两个传出更改被推送。我似乎无法找到任何选项来仅推送已提交更改的特定文件或文件子集。有没有办法在Aptana完成这个任务?

1 个答案:

答案 0 :(得分:1)

注意:我的答案与Aptana无关,而是涵盖我认为您的问题。

我认为主要的问题是对Mercurial如何存储其变化的误解,来自Subversion的背景非常合理。

在Subversion中,可以认为更改历史记录是按文件存储的。也就是说,如果你更改了两个文件并提交它们,你可以很容易地,而且经常会遇到工作副本中的文件版本不同的情况。

在Mercurial中,更改历史记录存储在整个存储库中。 Committing将创建一个新的“Changeset”,它存储当时整个存储库的状态。当您决定push更改到另一个存储库时,所有修改(或添加,删除或......)都将被推送出来。

需要注意的是,当您决定commit存储库的新变更集时,您可以选择性地包含或排除文件。未包含的文件将作为挂起修改保留在工作副本中,可以在新的更改集中提交。

我希望这对你有意义 - 如果你已经理解它,这是一个逻辑概念,但我觉得解释起来很棘手。

所以,关于你的问题。

假设您的存储库中有两个文件file1file2(就是那个或foobar)。你已经改变了它们,但它们与不同的问题有关 - 它们可以作为不同的变更集提交:

$ hg log
changeset 0:....
summary:   First commit

$ hg st
M file1
M file2

$ hg commit -I file1 -m "Changed file1"

$ hg log
changeset 1:....
summary:   Changed file1

changeset 0:....
summary:   First commit

$ hg st
M file2

在这里,您可以看到我们只将一个文件提交到存储库中,并且它在当时创建了一个新的变更集,其中包含存储库的完整状态,减去对{{1的更改}}。我们现在可以这样做,提交file2,这将创建另一个变更集。这种方法的问题在于变更集是根据其父级进行排序的,因此您不能轻易file2只更改push,而不会推送其父级 - 但它可能更接近于你好吗。


TL; DR:SVN存储单个文件的状态,Mercurial存储整个存储库的状态。

我非常推荐阅读Mercurial: The Definitive Guide。这个地方有点过时了,但我认为它可以更好地实现这个概念。