我修改,添加,提交并推送对子模块的更改,然后转到主模块目录并运行:
# git status
...
Changes not staged for commit:
...
modified: deps/gr-d13 (modified content, untracked content)
...
# git add deps/gr-d13
(no errors)
# git status
...
Changes not staged for commit:
...
modified: deps/gr-d13 (modified content, untracked content)
...
与以前完全相同。我的子模块未上演。为什么不?
主模块和子模块都在同一分支上。
让我们从在游泳池深处的潜水开始。这个:
modified: deps/gr-d13 (modified content, untracked content)
表示您的超级项目Git执行了以下操作:
(cd deps/gr-d13; git status)
来查找子模块存储库的状态,以及当子模块存储库完成时,其(子模块的)工作树具有已修改的文件和未跟踪的文件。
如果要提交这些文件,则需要自己输入子模块存储库,并像使用任何Git存储库一样使用它。只需记住,它当前处于分离的HEAD模式,并且已签出特定的提交。该提交可能具有也可能没有关联的分支名称。如果没有,请记住您需要做什么。
一旦在子模块中有了新的提交,就可以让超级项目引用该新的提交。为此,返回到超级项目,然后运行git add deps/gr-d13
。这将告诉超级项目Git进行操作(cd deps/gr-d13; git rev-parse HEAD)
以找到正确的提交哈希ID,然后将该哈希ID记录在超级项目的索引中。
请记住,子模块不过是第二个Git存储库。您的(顶级)Git存储库现在是一个超级项目。在您的超级项目中,您所做的每个提交都列出了两件事:
deps/gr-d13
您的超级项目Git在执行此操作时应使用的哈希ID:
(cd $submodule; git checkout $hash)
以便在指定的提交时强制子模块Git处于分离的HEAD模式。
(超级项目还应该有一个.gitmodules
文件,其中包含超级项目的新克隆才能运行git clone
创建子模块存储库的命令所需要的信息。该文件也应该在每个提交中。一旦子模块存储库存在,Git不过,不再需要该.gitmodules
文件以获取此信息。)
您在工作树中看到的文件不是已提交的文件。(提交的文件以特殊的,压缩的,只读的,仅Git的格式存储,作为提交快照的一部分。)与在任何Git存储库中一样,当您检出提交时,其文件将进入该索引中存储库,然后从那里复制它们,并扩展成有用的形式,到工作树,以便您可以查看和使用它们。
您的超级项目内部没有任何子模块提交,而只有子模块提交的哈希ID。但是,用于超级项目存储库的工作树确实具有一个目录(或文件夹,如果您更喜欢该术语,则包含该子模块的.git
1和工作树)。这意味着子模块的工作树是超级项目工作树的子目录。
您可以随时使用:
cd deps/gr-d13
自己进入子模块存储库。如果这样做,则可以像使用任何存储库一样使用它。HEAD
就像任何存储库一样,它具有提交,a ,索引和工作树。该子模块存储库唯一的特别之处在于,有一个外部存储库,有时(在被告知时)会对cd
子模块执行agit checkout <hash>
操作,并在指定的提交时再次强制其进入分离的HEAD模式。
1在旧版本的Git中,这.git
将是一个实际目录,其中包含子模块的存储库数据库(即,不是工作树的所有内容)。在现代Git中,这.git
将是一个普通文件。Git现在将子模块存储库数据库“吸收”到超级项目中的超级项目中,该目录位于.git
保存超级项目数据的目录下。
由于Git是一个分布式版本控制系统,因此使用常规Git存储库通常会有点复杂。这意味着您不仅必须管理您的存储库,还必须担心其他一些存储库,例如GitHub上的某个存储库,该存储库主要包含相同的提交,但具有自己的分支名称。
换句话说,要使用一个Git存储库,您实际上是在使用两个Git存储库:您的和另一个位于的Git存储库origin
。您的工作量增加了一倍(或者更糟糕,因为它们之间的协调松散)。
当您将子模块添加到组合中时,工作量会再次加倍(或更糟),因为该子模块是Git存储库,因此它也具有Git存储库origin
。因此,现在您正在使用四个Git存储库。您和您的原籍是相互协调的。并且您必须与子模块存储库进行协调。但是,您的子模块存储库也与其 协调origin
。
因为您的超级项目存储库一直HEAD
在子模块中分离,所以实际上在子模块中执行任何工作都需要输入它,将其重新附加HEAD
到其分支名称之一(或在合适的情况下创建新的分支名称),然后再进行工作并进行新提交。完成这些新的提交后,您可能希望通过超级项目来测试它们,也许是通过在超级项目中进行提交来进行的。如果它们无法解决问题,则可能需要撤消所有这些提交。
(您可以根据需要在超级项目和子模块存储库中进行未提交的更改。根据您的任务和要求,这可能会更容易。)
无论如何,一旦子模块提交存在且正确,您将要使用git push
子模块中的提交将其提交到origin
。您可以在更新超级项目以使用这些提交之前或之后执行此操作。请记住,如果您确实先更新了超级项目,则应确保git push
先从子模块进行更新,然后再git push
进行超级项目的更新。原因是其他想要您的新超级项目提交的人也将需要您的新子模块提交。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句