我可以嵌套Git存储库吗?我有:
/project_root/
/project_root/my_project
/project_root/third_party_git_repository_used_by_my_project
它是否有意义git init/add的/project_root,以缓解当地的一切管理或做我必须管理my_project并单独的第三方呢?
我可以嵌套Git存储库吗?我有:
/project_root/
/project_root/my_project
/project_root/third_party_git_repository_used_by_my_project
它是否有意义git init/add的/project_root,以缓解当地的一切管理或做我必须管理my_project并单独的第三方呢?
Answers:
您可能正在寻找称为submodules的Git功能。此功能可帮助您管理嵌套在主存储库中的从属存储库。
将第三方库放在单独的存储库中,并使用子模块将它们与主项目关联。这是一个演练:
http://git-scm.com/book/en/Git-Tools-Submodules
在决定如何划分一个回购协议时,我通常会根据修改它们的频率来决定。如果它是第三方库,并且只有您对其进行的更改正在升级到较新的版本,那么您一定要将其与主项目分开。
仅出于完整性考虑:
我建议使用另一种解决方案:子树合并。
与子模块相比,它更易于维护。您将以常规方式创建每个存储库。在主存储库中时,您希望将另一个存储库的主目录(或任何其他分支)合并到主目录的目录中。
$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`
然后,为了将另一个存储库拉入目录(以对其进行更新),请使用子树合并策略:
$ git pull -s subtree OtherRepository master
我已经使用这种方法很多年了,它是有效的:-)
可以在git howto doc中找到有关此方法的更多信息,包括与子模块进行比较。
您可以添加
/project_root/third_party_git_repository_used_by_my_project
至
/project_root/.gitignore
这样可以防止嵌套的回购包含在父回购中,您可以独立使用它们。
但是:如果用户在父仓库中运行git clean -dfx,它将删除忽略的嵌套仓库。另一种方法是对文件夹进行符号链接,然后忽略符号链接。如果您随后运行git clean,则将删除符号链接,但“嵌套”存储库将保持原样,因为它确实位于其他地方。
git-subtree将帮助您在单个树中处理多个项目,并为它们保留可分离的历史记录。