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

问题描述:

我有一个有两个分支的存储库(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 subtree push --prefix dist origin gh-pages 

,因为这将只是/dist复制到另一个文件夹/distgh-pages分支

+0

你说的份额呢?你希望它们始终保持同步,还是能够从另一个推动到另一个? – merlin2011

+0

为什么不使用符号链接? – morxa

+0

@morxa,OP要同步两个分支,不是文件夹 – TheGeorgeous

是,也不是。

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

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

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

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

  • 斑点是包含您的文件或其他东西的实际原始字节流的对象。
  • 是描述目录的对象,就像在常规文件系统中一样。它们包含斑点的哈希有自己的文件名,模式一起等
  • 承诺是包含一个树对象,如作者,时间戳各类信息的散列的对象,父母承诺等

这三个事实上,每个文件都是.git/objects中的一个文件,其文件名与其内容哈希值相同。

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

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

现在,有两个故事,留给自己:

  • 了解如何假树,看起来像你想要的。正如我所说我现在没有外壳,但是你应该能够用https://git-scm.com/book/en/v2/Git-Internals-Git-Objects中的例子弄清楚它如何读写单个对象。
  • 不幸的是,由于这些只读数据结构的性质,你必须每次重新建立你_include树,因为所包括的树木的变化之一也将给予他们新的哈希值。你可能猜到了 - 没有任何东西可以实现更改任何git对象。更改总是通过创建新对象来实现的。这应该不是一个大问题,但是您可以为您的脚本创建适当的钩子,为您自动创建一个新的树。

坦率地说,虽然,一样迷人这一切的是,你还不如什么都忘记了我刚才说的,并简单地用git的瓷器命令重新建立新的_include在钩每次提交接触的源目录,由从源分支检查出来,然后复制(与cp,不是一些特殊的git命令)并将它们在目标分支中进行合并。 Git会实际上自动搞清楚这些子目录是一样它已经有了各自的对象,所以最终的结果实际上是完全一样的,如果你创造了树对象自己!