【问题标题】:Share code between branches in different folders在不同文件夹中的分支之间共享代码
【发布时间】:2016-03-01 22:20:21
【问题描述】:

我有一个带有两个分支的存储库(mastergh-pages)。我的master 分支的文件夹结构如下所示:

/dist
    /js
    /css
/other-folders

在我的gh-pages 分支中,我有一个_include 文件夹,其中包含一些文件。我想与我的gh-pages 分支共享/dist/css/dist/js 文件夹中的代码,以便我的gh-pages 文件夹结构如下所示:

/_include
    /js
    /css

/_include
    /dist
        /js
        /css

用 git 可以实现这样的事情吗?我不能只使用

git subtree push --prefix dist origin gh-pages

因为这只会将/dist 复制到我的gh-pages 分支中的另一个/dist 文件夹

【问题讨论】:

  • 分享是什么意思?您希望它们始终保持同步,还是能够从另一个推送到其中一个?
  • 为什么不使用符号链接?
  • @morxa,OP 想要同步两个分支,而不是文件夹
  • @merlin2011 如果它们可以始终保持同步,那就太好了。但我不介意使用命令将我的 dist/jsdist/css 文件夹从 master 分支推送到我的 gh-pages 分支。
  • @TheGeorgeous 我想在两个分支之间同步两个文件夹(js 和 css)

标签: git


【解决方案1】:

是和否。

是的,您可以在分支之间共享子目录 - git 一直都在这样做。

不,你不能让它们与常规 git 命令自动同步。

不幸的是,我现在还没有接近 shell,所以我无法提供命令,但我会告诉你方法。

Git 具有三种基本数据结构:

  • blob 是包含文件或其他内容的实际原始字节流的对象。
  • 是描述目录的对象,就像在常规文件系统中一样。它们包含 blob 的哈希值以及它们的文件名、模式等。
  • commits 是包含树对象哈希和各种信息(如作者、时间戳、父提交等)的对象。

这三个东西实际上都是.git/objects 中的一个文件,文件名等于它们的内容哈希。

对于您的问题,关键是这些对象构建了一个只读的有向无环图,就像您习惯于提交一样。

您对树木感兴趣。在摆弄git cat-file 之后,你可以看看一些树对象。如果您能够破解您的 _include 树,您将立即注意到它将如何解决您的问题,因此它包含指向来自另一个分支的树的指针。请注意,在这个深层次中,在提交和分支之间共享树是完全自然的,git 一直都在这样做。这就是为什么存储库占用相对较小的空间以及 git 有时被称为分布式文件系统的原因。

现在,还有两个冒险留给你自己:

  • 了解如何伪造一棵看起来像您想要的树。正如我所说,我现在没有 shell,但您应该能够通过 https://git-scm.com/book/en/v2/Git-Internals-Git-Objects 中的示例弄清楚如何读取和写入单个对象。
  • 不幸的是,由于这些只读数据结构的性质,每次包含的树之一发生更改时,您都必须重新构建您的 _include 树,因为这也会为它们提供新的哈希值。你可能猜到了——实际上没有任何东西可以改变任何 git 对象。更改总是通过创建新对象来带来的。不过,这应该不是什么大问题,您可以为您的脚本创建一个适当的钩子,它会自动为您创建一个新树。

坦率地说,尽管这一切令人着迷,但您不妨忘记我刚才所说的一切,只需在每次提交触及源目录时使用 git瓷器命令从头开始重新创建_include,通过检查它们从源分支中取出,然后复制(使用cp,而不是一些特殊的 git 命令)并将它们组合到目标分支中。 Git 实际上会自动计算出这些子目录与其各自对象中已有的相同,因此最终结果实际上与您自己创建树对象完全相同!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2018-05-25
    • 2016-05-31
    • 1970-01-01
    • 2020-03-16
    • 2020-06-18
    • 2021-06-24
    相关资源
    最近更新 更多