文件夹中的多个GIT项目

mik*_*ike 2 git git-submodules

我有一个cpp文件夹,其中包含所有库和程序

cpp/libraries
cpp/programs

cpp/programs/proj1
cpp/programs/proj2
cpp/testing/
Run Code Online (Sandbox Code Playgroud)

到现在为止,使用一个大的cppgit 是完全可以的.但是,因为我目前一次只做一个以上的项目,所以两个项目的所有提交都混合起来变得相当不方便.我已经阅读了很多关于子模块的内容,包括为什么它们不太好.我的具体情况是100%离线(只推到USB记忆棒上随身携带).

我理想的解决方案是子文件夹(用于项目)中的几个gits,它们是完全独立的,但保留了"全部"git(用于测试和库等),其中包含整个cpp文件夹.就像使用.gitignore一样,只需将被忽略的子文件夹project1和2初始化为新的gits.它不是!我需要将库与项目放在同一个git中.但是,如果我在当前的一个中开始一个新的,我总是得到"修改未跟踪文件"而不是工作目录清理...

子模块真的可以解决这个问题吗?还有其他一些简单的方法吗?正如我所说,这是一个特殊情况,因为这些是我的私人/本地gits,我只需要它就可以这么简单(不需要严格一致或任何东西).

我使用git作为cli工具,除非在gui thing(mac)中有很大的好处,我真的不想改变它.

谢谢你的建议.

Col*_*ett 5

Git内置了两种解决方案:子模块子树.还有许多外部解决方案使用工具来实现类似的过程(例如git-repo).

子模块使用完整的独立存储库为子项目实现.这些存储库通常从远程克隆,然后克隆存储在超级项目的.git目录中,并将其工作树投影到超级项目工作树的子目录中.子项目的历史记录与远程的"上游"或共享历史直接相关.也就是说,Git提交哈希值对于相同的提交是相同的.

子树以更"聪明"的方式实现(好的和坏的).子项目作为文件树导入到超级项目中,但Git记得它已经这样做,并且可以支持记住导入的远程URL等.因为子项目成为超级项目的真实和直接部分,所以很容易做出改变.您不必单独提交或管理对子项目的更改.但IMO这既好又坏.通常,您明确希望将子项目(例如库)更改故意与超级项目(例如,使用库的应用程序)分开.而且使用子树而不是子模块更容易忽略这种区别.同样使用子树,所有子项目提交都将与超级项目提交混合在一起.你可以"压缩"子树提交,

Git的一个好处是,你可以像我一样,尝试在一个临时目录中创建项目的两个版本,每个版本使用子树和子模块,看看哪个更适合你.