Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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中的子模块库可最大限度地减少冗余_Git_Directory_Project Management_Organization - Fatal编程技术网

git中的子模块库可最大限度地减少冗余

git中的子模块库可最大限度地减少冗余,git,directory,project-management,organization,Git,Directory,Project Management,Organization,我对使用git非常陌生,以前也没有真正尝试过“组织”我所从事的任何项目。然而,我最近刚刚购买了一台个人使用的开发服务器,我想开始组织我所有的项目并使用版本控制 在过去的8个小时里,我一直在研究不同的推荐方法来组织项目中的文件,我意识到这是一个非常主观的问题。然而,我已经开发了一个系统,我认为它可以为我的任何事业工作,我有一个非常客观的问题,关于如何使用目录结构完成某项任务 目前,我正在研究类似于以下内容的结构: src/ - All deliverables in an uncompiled f

我对使用git非常陌生,以前也没有真正尝试过“组织”我所从事的任何项目。然而,我最近刚刚购买了一台个人使用的开发服务器,我想开始组织我所有的项目并使用版本控制

在过去的8个小时里,我一直在研究不同的推荐方法来组织项目中的文件,我意识到这是一个非常主观的问题。然而,我已经开发了一个系统,我认为它可以为我的任何事业工作,我有一个非常客观的问题,关于如何使用目录结构完成某项任务

目前,我正在研究类似于以下内容的结构:

src/ - All deliverables in an uncompiled form (PHP files, c source files, etc)
data/ - Crucial but unrelated data (SQL databases, etc.)
lib/ - Dependencies -- THIS IS WHERE MY QUESTION LIES
docs/ - Documentation
build/ - Scripts to aide in the build process
test/ - Unit tests
res/ - Not version controlled. Contains PSD files and non-diff-able stuff
.gitignore
README
output.zip - Ready-to-install finished product (just unzip and go)
正如我提到的,我真正的问题是围绕这个
lib/
目录。这需要包含我的项目需要运行的所有文件和程序,但这些文件和程序不在我的项目范围内,我将不进行编辑。我需要此文件夹具备的一些功能:

  • 因为这些是运行最终产品所必需的,所以它们必须包含在output.zip中
  • 我希望此文件夹受版本控制,以便下载我的git存储库的任何人都可以访问所有依赖项
  • 如果多个项目具有相同的依赖关系,我不希望在服务器上有同一文件的18个冗余副本
  • 我希望能够从我的其他项目中提取这些依赖项(一个项目应该能够作为单独项目的库)
通过使用虚拟目录(symlink),我可以避免同一文件的18个冗余副本,但是据我所知,git会将此symlink原样复制到存储库中,而不复制文件。因此,如果其他人获取我的存储库,他们将有一个悬空的指针,而没有库

起初,看起来我可以用它做我想做的事情。然而,据我所知,这需要另一个存储库的全部内容,并将其视为子目录。因此,如果我包含“dependency A”,我的库文件夹将如下所示:

/lib/A/src/
/lib/A/data/
...
/lib/A/test/
.gitignore
README
output.zip
对于脚本(PHP、Perl等),我可能可以使用
require('lib/a/src/dependency.PHP')
加载依赖项,但是对于DLL或二进制文件,我无法从output.zip读取输出文件。我可以将完成的项目直接存储在根级别,而不是封装在一个漂亮的zip文件中,但是如果项目是,比如说,一个网站,这可能意味着数以百计的文件凌乱在我的根存储库中

如何将另一个存储库包含为我自己的库,如何在我自己的项目中轻松引用库文件,如何将库有意义地复制给获取我的存储库的任何人,以及如何防止在我的开发服务器上重复复制相同的文件

编辑:在谷歌上搜索了一段时间后,我发现它只针对PHP项目。虽然AutoLoad可能允许您在PHP环境中屏蔽底层文件系统,但如何将类似的方法应用到C++项目中?还是Python项目?还是Java项目

当我今天更多地思考这个项目时,我想到了一些其他的想法,这些想法可能需要一个新的思维方向。首先是非常深的库嵌套问题。如果项目A依赖于项目B,项目B依赖于项目C,项目C依赖于项目D,那么您的目录结构如下:

A/lib/
A/lib/B/
A/lib/B/lib/
A/lib/B/lib/C/
A/lib/B/lib/C/lib/
A/lib/B/lib/C/lib/D/
显然,这不仅会让人恼火,而且会以自己的方式变得多余


在做git存储库时,普通人如何处理依赖关系?

在我参与的项目中,子模块仅适用于某些情况下的依赖关系管理,在其他情况下,这是由其他框架补充的。大多数情况下,当我需要完整的存储库时,我更喜欢使用子模块,例如,如果我有一个可以跨项目共享的公共构建脚本

在不同的堆栈中,有专门的工具专注于依赖关系管理-

  • 在.net世界中
  • +在红宝石中 世界
等等

这些工具负责冗余管理

目前,我在一个.net项目中,在那里我们有这个设置-

  • Powershell使用子模块跨项目共享构建脚本。Buildscript存储库包含部署任何.net应用程序所需的所有第三方可执行文件和相应的包装器powershell脚本,以及一些加载约定、配置等的脚本
  • Nuget服务器(通过Teamcity)托管跨项目共享的通用二进制文件的Nuget包。Nuget Package restore是一项功能,允许在构建过程中获取包

  • 你问了一个一般性的问题,但也问了一些具体的例子。我将倾向于更一般化。简而言之:这是一个构建系统问题,而不是版本控制系统问题

    就Java而言,您可以使用几种不同的依赖关系管理/解析工具。构建系统应该理解如何在构建时获取这些依赖项并使它们可用。然而,它们是暂时的——您不会将它们签入版本控制。此外,Maven(例如)使用一个
    /target
    文件夹,该文件夹包含您的输出(例如output.zip,我也建议使用它,因为它可以更轻松地清理输出。如果您有多个输出文件呢?变量呢?等等)以及其他项目,如静态分析输出-它还使用外部目录本地缓存依赖项,但这可能是短暂的,它不会在意。一句话:它不会持久化到版本控制中

    据我所知,这在C++中不是那么容易的。CMake建筑外部项目。我只是最近才开始玩弄这个来看看什么是可能的,所以我不想说“我”来误导你