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