Git仓库在Git仓库

我有一个Git仓库,包括一个Git仓库。

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

可以使用这个架构吗?

你可以嵌套git仓库:
父母回购将简单地 忽略嵌套的回购

jleedev评论和说明这个主要脚本 ,父回购将通过gitlink跟踪嵌套回购状态。
(gitlink =指向另一个仓库提交的对象的SHA-1。Git链接只能由SHA或通过提交标记来指定。
gitlink有一个特殊的模式' 160000 ',用于子模块,但也存在简单的嵌套回购)。

但是,通常的命令不会承认嵌套的回购: addcommit将只适用于一个回购,而不是其他。

git子模块将允许引用从父回购的嵌套回购,并保持一个确切的参考的儿童回购。

另一种select可能涉及:

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

你想要完成的是所谓的“子模块”,请查看这个链接: http : //git-scm.com/book/en/v2/Git-Tools-Submodules找出它是如何工作的。

我已经使用了这个结构很长一段时间,在外部仓库中.gitignore中指定的子仓库目录。

它混淆了我的编辑器(PhpStorm)中的git工具,它总是希望提交到外部回购,但在其他方面工作正常。 我在编辑器中将整个外部回购(包括所有innner回购)作为单个项目加载。 这使我可以轻松地search和检查外部回购中的代码,同时在内部回购中进行工作。

我在Git bash中执行所有的Git操作。

子模块可能是一个更好的方法。 我没有时间去调查他们是否会更好地使用PhpStorm。

是的,你可以使用这种模式。 我以前用它来将SVN外部引入git-svn克隆。 子模块现在可以处理得更好,但是当时并不适合我的需求。

您需要将以下内容添加到repo1 / .git / info / exclude中,以确保repo2中的更改不会与repo1混用:

 repo2 

我很惊讶这个线程中没有人提到包pipe理解决scheme。

确实,git子模块可以让你用你所描述的架构进行开发,git子树提供了许多人喜欢的类似解决scheme。

在我看来,软件包pipe理软件是任何复杂项目的组成部分。 我喜欢composer php,因为它支持直观的工作stream程: https : //getcomposer.org/

不幸的是git子模块不被PHPstorm支持:http://youtrack.jetbrains.com/issue/IDEA-64024

我也同意上面的罗纳德·威廉姆斯。 git-submodules的主要目的是更新从外部获取的代码,而不需要提交更新,如果代码被更新修改的话。 composer php包pipe理系统也一样。 实际上, 他们不build议也提交这些更改,并忽略项目根目录下的.gitignore中的供应商文件夹。 如果你试图提交这个文件夹是一场噩梦,因为某些供应商/ some_repo可能是开发版本,因此它们有.git文件夹,导致所有这些软件包变成子模块,即使你不用git submodule add添加它们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 php构build的仓库),这是非常方便有时,将此条目添加到根.gitignore 之前的初始提交:

 .git !/.git 

不幸的是,为了使整个配方工作,你需要运行git add命令为每个你想以后要修改个别的嵌套回购。 请注意,回购path中的斜线是必须的

 ~/project_root $ git add vendor/some_repo/ vendor/another_repo/ 

然后修改vendor / some_repo中的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) # # modified: vendor/some_repo/some_file 

这样,你可以像往常一样运行git add --all ,然后在project_root中git commit "Changes ..."