一个文件夹中有多个 GIT 个项目

Multiple GIT projects in a folder

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

cpp/libraries
cpp/programs

cpp/programs/proj1
cpp/programs/proj2
cpp/testing/

到现在为止,用一个大的cppgit就可以了,什么都有。但是,因为我现在一次做多个项目,所以将两个项目的所有提交混在一起变得相当不方便。 我已经阅读了很多关于子模块的内容,包括为什么它们不是很好。我的具体案例是 100% 离线(只推到一个 U 盘上随身携带)。

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

子模块真的可以解决这个问题吗?还有其他一些简单的方法吗? 正如我所说,这是一个特例,因为这些是我的 private/local git,我只需要它尽可能简单(不需要严格一致或任何东西)。

我使用 git 作为 cli 工具,除非在 gui 东西 (mac) 中有巨大的好处,否则我真的不想改变它。

感谢您的建议。

我经常为 Github 和 Bitbucket 上允许的 WIKI 存储库执行此操作。只需忽略子文件夹,并将存储库作为单独的存储库进行管理。不是问题。

因此,我不为此目的使用子模块。

Afaik,submodules 是唯一的内置解决方案。

如果您使用像 SmartGit 这样的工具,那么您可以同时打开多个 Git 项目并单独提交每个项目(SmartGit 允许打开几个 windows,每个 Git 个项目一个)。为了方便管理,我建议建立一个"maintenance"文件夹:

cpp/maintenance/

其中包含脚本和一个 "build all" 脚本。那里的一个脚本应该是 "git command over all other folders",这样您就可以在项目的所有部分快速 运行 一个 git statusgit push,以确保您不会不小心错过任何东西。

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

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

子树 以更 "clever" 的方式实现(无论好坏)。子工程以文件树的形式导入到上级工程中但是Git记住了它是这样做的,并且可以支持记住被导入的远程的URL等。因为子工程成为了一个真实而直接的部分的超级项目,很容易做出改变。您不必单独提交或管理对子项目的更改。但在我看来,这既好又坏。通常,您明确希望有意将子项目(例如库)更改与超级项目(例如使用库的应用程序)分开。与子模块相比,子树更容易忽略这种区别。同样对于子树,所有子项目提交都将与超级项目提交混合在一起。您可以 "squash" 提交子树,但这使得从远程子树推送和拉取更改变得更加困难(并且耗时),因为每次在超级项目中更新时,压缩的树都会从远程分支。

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