【问题标题】:Git: how to avoid repetitive committing with sub-sub-sub... Git -repos?Git:如何避免重复提交 sub-sub-sub ... Git -repos?
【发布时间】:2012-04-09 01:48:12
【问题描述】:

我有很多子回购,这意味着一个有较小回购的大伞式回购。现在,当我在叶子仓库中进行提交时,这将自动意味着我在其父母中得到了改变。如果您将结构假设为二叉树,您可能会意识到这很荒谬——拥有 5 个 git-repo 深度结构很容易意味着$ git commit -m 'did 1'; cd ..; git commit -m 'did 1 as mentioned'; ... git commit -m 'did 1 same as earlier'。如何避免这种重复提交?

示例 1:关于问题的图形示例

X---------|
          |
Y---------A --------|
                    |
          B --------|<-----Pictures (graphic designers, animators--have repo)
                    |
          C --------|

更改图片会更改 A、B、C、X 和 Y —— 臃肿的提交,由于一次更改而导致 6 次提交,糟糕的重复!现在,使用图片的人与使用 X、Y、A、B 和 C 的人完全不同,这让事情变得更加晦涩难懂。

示例 2:使用 sub-sub...-repos 试用 -repos

请复制此示例here。您可以使用 3 级 -sub-repos 进行测试。

到目前为止建议

  1. Git 中的基本子模块,更多 here.

  2. Gitslave here.

【问题讨论】:

    标签: git commit repeat


    【解决方案1】:

    不要在存储库中创建存储库。这将避免重复提交。可能还会解决其他问题。

    如果您真的认为您需要在存储库中使用存储库,那么请使用子模块。

    【讨论】:

    • 正如@GoZoner 建议的子模块是你想要的。你可以在这里阅读它们:progit.org/book/ch6-6.html
    • 'children directory WWW'相对于'Hello'在哪里?
    • 正如 GoZoner 指出的那样,我们不知道“WWW”是什么,但是一旦配置了子模块,您的文件结构应该与现在相同。唯一的区别是你如何提交事情。现在我考虑了一下,您仍然需要多次提交子模块,您将只是提交子模块更改而不是实际文件。如果没有多次提交所有内容,我认为没有办法做你想做的事。
    • 您是否要求将当前子存储库转换为子模块的步骤?
    • @GoZoner 我目前 rm 存储库或将其移至其他位置,进行愚蠢的提交,然后将其添加回去以将子存储库放入子模块,一次提交 agani,不确定是否正确-- 得到一个额外的提交,不好吗?
    【解决方案2】:

    您的设计或结构可能很差,这可能是 GoZoner 命令"Don't create repositories within repositories." 背后的前提,但也可能您的项目已经到了需要更强大工具的地步。有时基本的子模块还不够,而且你的仓库太宽泛,那么你可能应该看看——GitSlave!它是一个工作流工具,您可以在其中指定您的超级存储库,然后指定从存储库。您可以使用 gits -command -- manual here,而不是重复提交。

    相关话题

    【讨论】:

      【解决方案3】:

      您存储库中的文件是否经常与其他存储库中的其他文件相关联的更改?如果是这样,多个存储库不是你的朋友。只有当它们完全(或几乎完全)相互独立时,您才应该使用多个存储库。

      另一方面,如果它们是完全独立的,那么您可以只使用单独的存储库。然后,要构建某种可能使用来自每个存储库的文件的主项目(即,它依赖于其他存储库),然后您使用子模块。

      一个存储库是另一个存储库的子模块意味着它依赖于该子模块。如果 API 不稳定,子模块之间的依赖链接可能不是一个好主意,但如果 API 稳定,因此其中一个的更改不会直接影响另一个(即,无需更改代码),那么两个顶级子模块可以互相依赖。

      现在,我一直在谈论子模块,但是如果您想检查一下,看看您喜欢什么,还有一个称为“子树”的替代方案。它位于主 git 存储库的 contrib/ 部分,因此默认情况下不安装它。还存在子树策略(ProGit 章节链接到评论)

      【讨论】:

      • @hhh 如果部署存储库中的源代码无法更改,为什么需要存储库?另外,我还没有尝试过 git-slave ,但它对我来说并不太令人印象深刻;它似乎是减少重复而不是管理子存储库本身的解决方案。哦,git subtreegit merge -s subtree 是独立的实体。
      • @hhh Git 旨在跟踪源代码而不是部署的东西(这是我真的不太喜欢 Heroku 的原因......)。听起来您不应该使用 git 作为部署工具。例如,如果您想避免向开发人员提供图形资源的来源,您可以只重新部署 tarball 或其他东西。通常,git 存储库包含构建项目所需的最低限度没有生成的文件,没有./configure [如果使用autoconf]) ,正是因为总是在提交时更新这些生成的文件并重新生成存储库是有问题的。
      • 您能区分答案中的"git subtree""git merge -s subtree" 吗? Git-subtree 是 Git 的一些外部模块,而 "-s subtree" 中的名称 "subtree" 只是一个占位符?另外,我希望您查看此线程here,因为我建议使用 gitslave 但 git-subtree 可能是更好的选择,不知道,只是那里的新颖建议。
      • @hhh 我已经将它添加到答案中,subtree 指的是git subtree-s subtreegit merge -s subtree(或类似的类似合并的命令,接受-s 和@987654333 @)
      • @hhh 第二个链接。但是代码在 git.git 的 contrib/ 部分。另外,我并不是特别建议它,而是说它在那里(iirc,这是去年的 GSoC 项目或其他什么。我记得补丁系列在邮件列表中,所以它确实有来自 Junio 的代码审查等)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2017-09-02
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多