1

我有一个关于 suprepositories 的问题。我们的项目是这样设置的:

+ projectA
    + some files
    + dependencyA
        + some files

dependencyA是一个子存储库。它是这样创建的:

  1. cd项目A
  2. mkdir 依赖项A
  3. cd 依赖A
  4. 汞初始化
  5. hg pull ssh://hg@somerandomiphere/dependencyA
  6. 光盘..
  7. 回声依赖A = ssh://hg@somerandomiphere/dependencyA > .hgsub
  8. 汞添加
  9. 汞提交
  10. 汞推

如果我对 suprepository 进行更改,则从主项目提交并推送它们。由于递归,它们都将被推送到服务器。现在我的同事想从服务器中提取更改。但是由于主项目中没有任何改变,所以它不会工作。但是,如果我在主项目中更改某些内容并将其推送到服务器。他hg pull将获得最新的变更集,如果他这样做hg update了,它也会更新子存储库。这是预期的行为。

现在我的问题是,如果有一种方法可以提取更改,但适用于子存储库而不对其进行新的克隆,或者最好的方法是什么。

4

2 回答 2

2

Mercurial wiki 中的子存储库,p。2.5 “拉”

'pull' 命令默认不是递归的。这是因为 Mercurial 在请求更新特定变更集之前不会知道需要哪些子存储库。该更新将按需提取请求的子存储库和变更集。要一步获取拉取和更新,请使用“拉取 --update”。

请注意,考虑到子存储库位于工作目录中,这完全符合“拉”在没有子存储库的情况下的工作方式:

  • 'hg pull' 为您提供上游变更集,但不会影响您的工作目录。
  • 'hg update' 更新工作目录的内容(在顶级仓库和所有子仓库中)

如果您有任何子存储库,最好始终使用 --update 进行拉取。这通常会确保更新不会错过任何变更集,因此更新不会导致任何拉动。如果由于跨分支而导致更新失败,则必须使用“hg update”来获取所有子存储库更新。

于 2011-11-07T13:49:52.740 回答
0

上面的建议就像我想象的那样工作。真正的问题是我创建子存储库的方式。

代替:

  1. cd项目A
  2. mkdir
  3. 依赖A
  4. cd 依赖A
  5. 汞初始化
  6. hg pull ssh://hg@somerandomiphere/dependencyA

应该很简单:

  1. hg clone ssh://hg@somerandomiphere/dependencyA 依赖项A

正如我们所知.hgsusbtate,提交后将锁定特定修订版的子存储库。这就是发生的事情,但是(!)在子存储库中执行hg pull以错误结束

paths cannot contain dot file components

因此,这意味着我的子存储库被锁定在提交后更新的修订版上,并且由于上面显示的错误,它无法从其存储库中提取更改。这个接受的答案很好地解释了为什么会发生这种情况。

解决方案:

克隆是要走的路

于 2011-11-08T16:34:24.083 回答