Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git repo子文件夹是否作为另一个repo的子树?_Git_Github - Fatal编程技术网

Git repo子文件夹是否作为另一个repo的子树?

Git repo子文件夹是否作为另一个repo的子树?,git,github,Git,Github,我的公司正在致力于从SVN迁移到Git——部分原因是为了利用使用Git作为源的部署软件。我们对应用程序堆栈的所有组件使用单一存储库(monorepo) 我们还考虑将PM2用于NodeJS应用程序管理/部署。因为这可以使用git存储库来部署更新,所以我们很乐意使用它,但实际上只需要部署存储库的一个子目录 是否可以创建一个只引用另一个git repo的一个子目录作为子模块/子树的git存储库? 类似这样的情况——回购A是主要的单一回购,回购B是只包含回购A中节点的回购 RepoA\ Compon

我的公司正在致力于从SVN迁移到Git——部分原因是为了利用使用Git作为源的部署软件。我们对应用程序堆栈的所有组件使用单一存储库(monorepo)

我们还考虑将PM2用于NodeJS应用程序管理/部署。因为这可以使用git存储库来部署更新,所以我们很乐意使用它,但实际上只需要部署存储库的一个子目录

是否可以创建一个只引用另一个git repo的一个子目录作为子模块/子树的git存储库?

类似这样的情况——回购A是主要的单一回购,回购B是只包含回购A中节点的回购

RepoA\
  Component1\
  Component2\
  DelphiApp\
  NodeJSApp\
  PHPStuff\
  Configurations\
  Utilities\
RepoB\

NodeJSApp\对于
git子模块
,简短的回答是否定的:

  • 您要么有存储库,要么没有

    • 如果您没有存储库,可以克隆它,现在就可以了。但是您有存储库,而不是存储库的某个子目录
  • 现在您已经拥有了存储库,您要么在其中有一些提交,要么没有

    (提交由散列ID标识,即那些丑陋的字母和数字字符串,由于人类不善于记住随机的字母和数字字符串,并且出于其他目的,每个存储库都有一组名称,每个名称都能记住一个散列ID。这些名称对您来说很好,但Git真正需要的是散列ID。)

    • 如果您没有提交,您可以让您的Git连接到另一个也有存储库的Git。您的Git可以向他们的Git询问他们有哪些提交,您没有,然后将这些提交放到Git存储库中。现在,如果他们有承诺,你也有
  • 现在您已经拥有了存储库和提交,您就拥有了所有的文件。提交是(或者更准确地说,包含/引用并获取)每个文件的完整快照

你不必使用所有的文件。您只能提取您关心的文件。但这比仅仅使用
git checkout name
来获取提交要困难得多,提交的散列ID存储在name
name
中,从而获取所有文件。更简单的方法可能就是走这条路

其他选择 注意,Git有各种处理子树的过程。其中一些被捕获到一个名为
git subtree
的脚本中,对于这个脚本,有一个教程看起来还可以(快速浏览)。使用
git子树
时不时地拆分库可以得到您想要的。一般来说,我不建议使用子树,不过最好将“类库”代码拆分成一个完全独立的存储库

然后,您可以使用多个独立的存储库(这非常简单),或者在包含所有其余代码的“使用库”存储库中,或者在“仅获取子模块”存储库中,使用从“库”存储库中选择特定提交超级项目,具有使用库和提供库存储库作为其(现在是两个)子模块的功能。也就是说,您可以:

  • 超级项目:包含
    Component1/*
    Component2/*
    DelphiApp/*
    PHPStuff/*
    Configurations/*
    实用程序/*
    ,并引用子模块
    NodeJSApp/
    ,以及
  • 库:包含将位于超级项目控制的
    nodejsap/
    目录中的文件
    *
或者,您有:

  • 超级项目:指子模块
    app/
    ,指子模块
    app/nodejsap/

  • app:Git存储库,包含
    Component1/*
    Component2/*
    等,但根本不引用
    NodeJSApp/
    。超级项目将把它们提取到
    app/
    ,这样它们的全名将是
    app/Component1/*
    app/Component2/*
    ,等等

  • 库:包含组成库的名为
    *
    的文件的Git存储库。超级项目将把它们提取到
    app/NodeJSApp/
    ,这样它们的全名将是
    app/NodeJSApp/*

除了被迫在第二种方法的
app/
下查找所有内容之外,它们之间唯一的区别在于,使用第二种方法,您将管理两个独立的Git存储库,一个用于应用程序本身,另一个用于库独立,然后使用超级项目来说明:通过从AppGit存储库中提取hashapp和从库Git存储库中提取hashlib来构建项目。也就是说,两个子项目都不需要知道Git的特性和散列ID:只有超级项目需要关心这一点

使用第一种方法,您不再需要
app/
顶级目录,但现在您在主应用程序中所做的每一次提交都会记录一个哈希ID,Git应该在构建之前在库子模块中提取该ID。如果更新库,则需要在超级项目中记录新的哈希ID。这与之前相同,只是“超级项目”是应用程序本身,而不是仅包含两个子模块引用的第三个Git存储库


两个Git存储库是更常见的方法,其中一个存储库具有文件,并充当超级项目来选择子模块中的特定提交。有时更方便。“一个超级项目来监督其他一切”的方法有时更有意义,但它肯定不太常见。

是的,你可以。只是不要使用子模块。子树或子回购可以帮助您实现这一点。您可以将“NodeJSapp”设置为子树或repoA中的子repo。它将有效地将目录映射到相应的一个目录存储库

这样你就会成为一个
RepoB\
  NodeJSApp\ <--subtree/submodule back to NodeJSApp in RepoA