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

时间:2016-03-01 22:20:21

标签: git

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

/dist
    /js
    /css
/other-folders

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

/_include
    /js
    /css

/_include
    /dist
        /js
        /css

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

git subtree push --prefix dist origin gh-pages

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

1 个答案:

答案 0 :(得分:2)

是和否。

是的,你可以在分支机构之间共享子目录 - git会一直这样做。

不,你不能使用常规git命令自动保持同步。

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

Git有三种基本数据结构:

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

这三件事实际上都是.git/objects内的文件,文件名等于其内容哈希值。

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

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

现在,还有两个冒险经历:

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

坦率地说,尽管如此,你可能会忘记我刚刚说过的所有内容,并且每次提交触及源目录时,只需在钩子中使用git porcelain命令从头开始重新创建_include,通过从源分支中检出它们,然后复制(使用cp,而不是一些特殊的git命令)并在目标分支中进行复制。 Git实际上会自动确定那些子目录与它们各自对象中已有的子目录相同,因此最终结果实际上与您自己创建树对象完全相同!