在不同文件夹中的分支之间共享代码
我有一个有两个分支的存储库(master
和gh-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
复制到另一个文件夹/dist
我gh-pages
分支
是,也不是。
是的,你可以共享分支之间的子目录 - 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会实际上自动搞清楚这些子目录是一样它已经有了各自的对象,所以最终的结果实际上是完全一样的,如果你创造了树对象自己!
你说的份额呢?你希望它们始终保持同步,还是能够从另一个推动到另一个? – merlin2011
为什么不使用符号链接? – morxa
@morxa,OP要同步两个分支,不是文件夹 – TheGeorgeous