【问题标题】:How to push only a subset of committed files?如何仅推送已提交文件的子集?
【发布时间】:2014-02-26 10:10:12
【问题描述】:

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

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

【问题讨论】:

    标签: eclipse mercurial push dvcs


    【解决方案1】:

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

    我认为主要问题是对 Mercurial 如何存储其更改的误解,这来自 Subversion 背景是完全合理的。

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

    在 Mercurial 中,更改历史记录存储在整个存储库中。提交将创建一个新的“变更集”,其中存储了当时整个存储库的状态。当您决定 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
    

    在这里您可以看到我们只向存储库提交了一个文件,并且它创建了一个具有当时存储库完整状态的新变更集,减去file2 的更改.我们现在可以做同样的事情,提交file2,这将创建另一个变更集。这种方法的问题是变更集是根据它们的父级排序的,所以你不能轻易地将push 更改为file2,而不推动它的父级 - 但它可能更接近你所追求的.


    TL;DR : SVN 存储单个文件的状态,Mercurial 将存储库的状态作为一个整体存储。

    我非常推荐阅读Mercurial: The Definitive Guide。它在某些地方有点过时,但我认为它会更好地传达这个概念。

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2021-06-03
      • 2020-09-19
      • 1970-01-01
      • 2020-02-03
      相关资源
      最近更新 更多