Git存储库中的Git存储库

时间:2011-05-12 16:05:39

标签: git

我有一个包含Git存储库的Git存储库。

repo1/
     .git/
     files
     repo2/
          .git/
          files
     files

是否可以使用此架构?

6 个答案:

答案 0 :(得分:20)

你可以使用嵌套的git repos:
父代表将只是忽略嵌套的repo

jleedev评论并使用此gist script说明父级回购 将通过a gitlink跟踪嵌套的回购状态 (gitlink =对象的SHA-1引用另一个存储库中的提交.Git链接只能由SHA或通过提交标记指定。
gitlink有一个特殊的模式“160000”,用于子模块,但也适用于简单的嵌套存储库。

但是,通常的命令不会确认嵌套的仓库:addcommit仅适用于一个仓库,而不适用于另一个仓库。

git submodule将允许引用来自父repo的嵌套repo,并保留子repo的确切引用。

另一种选择可能涉及:

  • 两个单独的Git回购(不嵌套)
  • 一个符号链接从一个到另一个的特定部分(包括Unix,但是Windows Vista +都有符号链接)

答案 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子模块:

Git submodules should be supported (IDEA-64024)