我有一个包含两个分支的存储库(master
和gh-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
文件夹
答案 0 :(得分:2)
是的,你可以在分支机构之间共享子目录 - git会一直这样做。
不,你不能使用常规git命令自动保持同步。
不幸的是,我现在不接近shell,所以我无法提供命令,但我会告诉你的方式。
Git有三种基本数据结构:
这三件事实际上都是.git/objects
内的文件,文件名等于其内容哈希值。
对于您的问题,关键是这些对象构建一个只读的有向非循环图,就像您习惯于提交一样。
你对树木很感兴趣。在摆弄git cat-file
之后,您可以看一些树对象。如果你能够破解你的_include
树,它会包含指向其他分支的树的指针,你会立即注意到它将如何解决你的问题。请注意,在这个深层次中,在提交和分支之间共享树是完全自然的,git会一直这样做。除此之外,这就是为什么存储库占用相对较小的空间以及为什么git有时被称为分布式文件系统的原因。
现在,还有两个冒险经历:
_include
树,因为这样也会为它们提供新的哈希值。您可能已经猜到了 - 实际上没有任何东西可以更改任何git对象。始终通过创建新对象来进行更改。这应该不是一个大问题,您可以为脚本创建一个适当的钩子,为您自动创建一个新树。 坦率地说,尽管如此,你可能会忘记我刚刚说过的所有内容,并且每次提交触及源目录时,只需在钩子中使用git porcelain命令从头开始重新创建_include
,通过从源分支中检出它们,然后复制(使用cp
,而不是一些特殊的git命令)并在目标分支中进行复制。 Git实际上会自动确定那些子目录与它们各自对象中已有的子目录相同,因此最终结果实际上与您自己创建树对象完全相同!