我有一个包含Git存储库的Git存储库。
repo1/
.git/
files
repo2/
.git/
files
files
是否可以使用此架构?
答案 0 :(得分:20)
你可以使用嵌套的git repos:
父代表将只是忽略嵌套的repo 。
jleedev评论并使用此gist script说明父级回购
将通过a gitlink跟踪嵌套的回购状态
(gitlink =对象的SHA-1引用另一个存储库中的提交.Git链接只能由SHA或通过提交标记指定。
gitlink有一个特殊的模式“160000
”,用于子模块,但也适用于简单的嵌套存储库。
但是,通常的命令不会确认嵌套的仓库:add
或commit
仅适用于一个仓库,而不适用于另一个仓库。
git submodule将允许引用来自父repo的嵌套repo,并保留子repo的确切引用。
另一种选择可能涉及:
答案 1 :(得分:8)
你正试图完成一个叫做“子模块”的事情。
请查看 Git Tools - Submodules ,了解其运作方式。
答案 2 :(得分:3)
我已经使用了那个结构很长一段时间了,在外部仓库中.gitignore中指定了子仓库目录。
它在我的编辑器(PhpStorm)中混淆了git工具,它总是想要提交外部仓库,但是否则工作正常。我将整个外部仓库(包括所有内部仓库)加载为编辑器中的单个项目。这使我能够在处理内部仓库时轻松搜索和检查外部仓库中的代码。
我在Git bash做所有Git操作,无论我正在做什么回购。
子模块可能是更好的方法。我没有时间调查他们是否能更好地使用PhpStorm。
答案 3 :(得分:2)
是的,您可以使用此模式。我过去曾用它来将SVN外部引入git-svn克隆。子模块现在可以更好地处理这个问题,但当时并不适合我的需求。
您需要将以下内容添加到repo1 / .git / info / exclude中,以确保repo2中的更改不会与repo1混合:
repo2
答案 4 :(得分:1)
我也同意Ronald William's answer。 Git子模块的主要目的是更新从外部世界获取的代码,而无需在更新修改代码时提交更改。
Composer包管理系统也是如此。实际上they don't recommend to commit those changes either并忽略项目根目录中.gitignore中的供应商文件夹。
如果您尝试提交此文件夹,这是一场噩梦,因为某些 vendor / some_repo 可以是开发版本,因此他们有一个.git文件夹,导致所有这些即使您没有使用git submodule add
添加它们,包也会成为子模块。如果在嵌套的.git存储库中修改some_file
,则可以看到类似这样的内容:
~/project_root $ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
# (commit or discard the untracked or modified content in submodules)
#
# modified: vendor/nested_repo (modified content)
请注意子模块中修改的内容条目,并且您在输出中看不到some_file
名称。相反,您会看到(已修改内容)通知,因为root_project .git将vendor / nested_repo视为子模块,并且不会跟踪该文件夹中的单个文件。
如果您运行git add --all
,则只有在vendor/nested_repo
中提交更改后才会得到结果,只有在此之后才能在根存储库中提交更改。
不要这样做。相反,如果您想将项目作为一个整体.git存储库(任何,不仅是Composer构建的存储库),这有时非常方便,请将此条目添加到根.gitignore BEFORE 初始提交:
.git
!/.git
不幸的是,要使整个配方工作,您需要为稍后要单独修改的每个嵌套存储库运行git add
命令。请注意,存储库路径中的尾部斜杠是必须。
~/project_root $ git add vendor/some_repo/ vendor/another_repo/
然后修改some_file
中的vendor/some_repo
并查看差异:
~/project_root $ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: vendor/some_repo/some_file
通过这种方式,您可以像往常一样在git add --all
中运行git commit "Changes ..."
然后project_root
。
答案 5 :(得分:0)
还有包管理解决方案。
Git子模块确实允许您使用您描述的体系结构进行开发,而Git子树提供的解决方案很多人都喜欢。
在我看来,包管理软件是任何复杂项目的组成部分。我喜欢Composer,因为它支持直观的工作流程。
不幸的是,PhpStorm不支持Git子模块: