gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:15:11 24 4
gpt4 key购买 nike

我有一个包含两个分支的存储库(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 可以实现这样的功能吗?我不能只使用

git subtree push --prefix dist origin gh-pages

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

最佳答案

是和否。

是的,您可以在分支之间共享子目录——git 一直都在这样做。

不,您不能使用常规 git 命令使它们自动同步。

不幸的是,我现在离 shell 还很远,所以我无法提供命令,但我会告诉你方法。

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

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

这三个东西实际上都是 .git/objects 中的一个文件,文件名等于它们的内容哈希。

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

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

现在,有两个冒险留给你自己:

  • 了解如何伪造一棵看起来像您想要的树。正如我所说的,我现在没有 shell,但是您应该能够通过 https://git-scm.com/book/en/v2/Git-Internals-Git-Objects 中的示例弄明白。它显示了如何读取和写入单个对象。
  • 不幸的是,由于这些只读数据结构的性质,每次包含的树之一发生变化时,您都必须重新构建您的 _include 树,因为这也会给它们新的哈希值。您可能已经猜到了 - 实际上没有什么可以改变任何 git 对象。变化总是通过创建新对象带来的。不过这应该不是什么大问题,您可以为脚本创建一个合适的 Hook ,它会自动为您创建一棵新树。

坦率地说,虽然这一切都很吸引人,但您不妨忘记我刚才所说的一切,并在每次提交触及源目录,通过从源分支中 check out 它们,然后复制过来(使用 cp,而不是一些特殊的 git 命令)并将它们 merge 到目标分支中。 Git 实际上会自动找出这些子目录与其各自对象中已有的相同,因此最终结果实际上与您自己创建树对象时完全相同!

关于git - 在不同文件夹中的分支之间共享代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35734762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com