在不同文件夹中的分支之间共享代码

Dan*_*iel 6 git

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

/dist
    /js
    /css
/other-folders
Run Code Online (Sandbox Code Playgroud)

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

/_include
    /js
    /css
Run Code Online (Sandbox Code Playgroud)

要么

/_include
    /dist
        /js
        /css
Run Code Online (Sandbox Code Playgroud)

git可以这样吗?我不能只使用

git subtree push --prefix dist origin gh-pages
Run Code Online (Sandbox Code Playgroud)

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

Ano*_*noE 3

是和不是。

是的,你可以在分支之间共享子目录 - git 总是这样做。

不,您无法使它们与常规 git 命令自动保持同步。

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

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

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

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

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

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

现在,你还有两项冒险:

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

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