我有一个cpp文件夹,所有库和程序都是这样排序的
cpp/libraries
cpp/programs
cpp/programs/proj1
cpp/programs/proj2
cpp/testing/
直到现在,使用一个大的cpp
git是完全可以的,它只包含其中的所有内容。但是,因为我目前一次只做一个以上的项目,所以两个项目的所有提交都混合起来变得相当不方便。
我已经阅读了很多关于子模块的内容,包括他们为什么不那么好。我的具体情况是100%离线(只推到USB记忆棒上随身携带)。
我理想的解决方案是子文件夹(用于项目)中的几个gits,它们是完全独立的,但保持"全部" git(用于测试和库等),其中包含整个cpp文件夹。就像使用.gitignore一样,只需将被忽略的子文件夹project1和2初始化为新的gits。它不是!我需要将库与项目放在同一个git中。但是,如果我在当前的一个中开始一个新的,我总是得到对未跟踪文件的修改"而不是工作目录清理...
子模块真的是一个解决方案吗?还有其他一些简单的方法吗? 正如我所说,这是一个特例,因为这些是我的私人/本地gits,我只需要它就可以这么简单(不需要严格一致或任何东西)。
我使用git作为cli工具,除非在gui thing(mac)中有很大的好处,否则我真的不想改变它。
感谢您的建议。
答案 0 :(得分:5)
Git内置了两种解决方案:子模块和子树。还有许多外部解决方案使用工具来实现类似的过程(例如git-repo)。
子模块是使用子项目的完全独立存储库实现的。通常从远程克隆这些存储库,然后将克隆存储在超级项目的.git
目录中,并将其工作树投影到超级项目工作树的子目录中。子项目的历史记录与远程的“上游”或共享历史直接相关。也就是说,Git提交哈希值对于相同的提交是相同的。
子树以更“聪明”的方式实施(无论好坏)。子项目作为文件树导入到超级项目中,但Git记得它已经这样做,并且可以支持记住导入的远程URL等。因为子项目成为超级项目的真实和直接部分,所以很容易做出改变。您不必单独提交或管理对子项目的更改。但IMO这既好又坏。通常,您明确希望将子项目(例如库)更改故意与超级项目(例如,使用库的应用程序)分开。而且使用子树而不是子模块更容易忽略这种区别。同样使用子树,所有子项目提交都将与超级项目提交混合在一起。您可以“压缩”子树提交,但这使得从子树远程推送和拉动更改变得更加困难(并且非常耗时),因为每次在超级项目中更新时,压扁的树都会偏离远程。
Git的一个好处是,你可以像我一样,尝试在一个临时目录中创建两个版本的项目,每个版本都使用子树和子模块,看看哪个更适合你。
答案 1 :(得分:1)
我经常为Github和Bitbucket上允许的WIKI存储库执行此操作。只需忽略子文件夹,并将存储库作为单独的存储库进行管理。不是问题。
所以,我不会为此目的使用子模块。
答案 2 :(得分:0)
Afaik,submodules
是唯一的内置解决方案。
如果您使用像SmartGit这样的工具,那么您可以同时打开几个Git项目并单独提交它们(SmartGit允许打开几个窗口,每个Git项目一个)。为了简单管理,我建议创建一个"维护"文件夹:
cpp/maintenance/
包含脚本和"构建所有"脚本。其中一个脚本应该是" git命令覆盖所有其他文件夹"这样您就可以在项目的所有部分快速运行git status
或git push
,以确保您不会意外遗漏某些内容。