【问题标题】:Working with subtrees in a second working copy在第二个工作副本中使用子树
【发布时间】:2014-07-09 10:40:19
【问题描述】:

假设我们有两个开发人员。一位开发人员在 foo/bar/ 路径的“主”git 存储库中添加了一个子树(foo/ 是一个普通目录,而 foo/bar/ 现在作为子树连接到一个单独的“子树”存储库)。第二个开发人员提取了更改并获得了 foo/bar/。但是在他的工作副本中 foo/bar/ 不是 git 的子树,它只是主存储库中的一个目录。

现在第二个开发人员的任务是将该子树切换到子树存储库中的新标签。他认为他可以使用git subtree pull 从子树存储库中提取,但他需要先添加子树。但是他的工作副本中的git subtree add 不起作用,因为该目录已经存在。在他的工作副本中,这个目录看起来不像是 git 的子树。

问题:

  • 第二个开发者如何告诉 git foo/bar/ 实际上是一个子树?
  • 他如何签出这个子树的标签?

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

    我不相信 subtree 有任何内置方法可以让第二个开发人员知道子目录实际上是 git 子树。表明这一点的最佳方法可能是使用子树根目录中的文件(我承认这并不理想)。

    您示例中的第二个开发人员不应该使用git subtree add。他们应该只需要先拉,然后再推(同样,他们需要其他方式来了解这一切的来源)。

    要更新子树,第二个开发者会: (注意:我是子树的新手,所以把它当作它的价值)

    1. 照常进行更改
    2. 将更改提交到“主”存储库
    3. 将他们的更改推送到“主”存储库
    4. 从子树中拉取:git subtree pull --prefix=bar ../bar.git master
    5. 推送以获取子树中的更改:git subtree push --prefix=bar ../bar.git master

    【讨论】:

      【解决方案2】:

      子树(与子模块相比)的全部意义在于它们看起来不像存储库并且不需要任何配置文件。 git-subtree 使用“git-subtree-”前缀对初始合并提交中后续合并所需的所有信息进行编码,因此在您的示例中,两个开发人员的工作副本之间确实没有区别。两者都可以git subtree pull ...

      如果您想拥有可以从上游轻松更新的显式(即可识别)子存储库,请使用git submodule

      【讨论】:

      • 那么为什么很多使用子树的例子似乎鼓励使用'--squash'?另外,您能否提供更详细的说明来说明开发人员应该如何执行此操作?
      • 我真正想说的是“不要重新发明轮子”。我已经相应地更新了我的答案。关于--squash 的部分具有误导性,我将其删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多