我修改,添加,提交并推送了对子模块的更改,然后转到主模块目录并运行:
# 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存储库一样使用它。只需记住,它当前处于模式,并且签出了特定的提交。该提交可能具有也可能没有与之关联的分支名称。如果没有,请记住您需要做什么。
一旦子模块中有新提交,就可以让超级项目引用该新提交。为此,请返回超级项目,然后运行git add deps/gr-d13
。这将告诉超级项目Git进行(cd deps/gr-d13; git rev-parse HEAD)
查找正确的提交哈希ID,然后将该哈希ID记录在超级项目的索引中。背景
superproject
。在您的超级项目中,您所做的每个提交都列出了两件事:deps/gr-d13
(cd $submodule; git checkout $hash)
以便在指定的提交时强制子模块Git处于detached HEAD
应该
也有一个.gitmodules
文件,其中包含超级项目的新克隆才能运行创建子模块存储库的git clone
命令所需的信息。该文件应位于一旦子模块存储库存在,Git就不再需要.gitmodules
文件来获取此信息。)您在工作树
中看到的文件是不是已提交的文件。 (提交的文件以特殊的,压缩的,只读的,仅Git的格式存储,作为提交快照的一部分。)与在任何Git存储库中一样,当您检出提交时,其文件将进入index 到该存储库,然后从那里复制它们,并扩展成有用的形式,到工作树,以便您可以查看和使用它们。您的超级项目内部没有任何子模块提交,它只有子模块提交的哈希ID
。但是,用于超级项目存储库的工作树确实具有一个目录(或文件夹,如果您更喜欢该术语,则包含),该目录包含子模块的.git
和工作树。这意味着子模块的工作树是超级项目工作树的子目录。您可以随时使用:cd deps/gr-d13
自行进入子模块存储库。如果这样做,则可以像使用任何存储库一样使用它。就像任何存储库一样,它具有提交,版本控制系统。这意味着您不仅需要管理your存储库,还需要担心其他一些存储库,例如GitHub上的一个存储库,该存储库主要包含相同的提交,但具有自己的分支名称。换句话说,要使用一个Git存储库,您实际上正在使用HEAD
,索引和工作树。该子模块存储库唯一的特别之处在于,有一个外部存储库,有时(在被告知时)会对子模块执行cd
并在指定的提交时运行git checkout <hash>
再次将其强制进入分离的HEAD模式。使用子模块和推/取
使用常规Git存储库通常会有点复杂,因为Git是
distributed
two
Git存储库:您的和另一个位于origin
的Git存储库。您的工作量增加了一倍(或者更糟糕,因为它们之间的协调松散)。当您将子模块添加到组合中时,您的工作量会再次加倍(或更糟),因为子模块is
是Git存储库,因此it也具有origin
。因此,现在您正在使用four Git存储库。您和您的原籍是相互协调的。并且您必须与子模块存储库进行协调。但是,您的子模块存储库也与its origin
进行了协调。因为您的超级项目存储库会不断分离子模块中的HEAD
,所以实际上在子模块中执行任何work
都需要输入它,并将其HEAD
重新附加到its分支名称之一(或创建一个新的分支名称(如果适用),然后再进行工作并进行新的提交。完成这些新的提交后,您可能希望通过超级项目来测试它们,也许是通过在超级项目中进行提交来进行的。如果他们无法解决问题,则可能需要撤消所有这些提交。((您可以根据需要在超级项目和子模块存储库中进行未提交的更改。根据您的任务和要求,这可能会更容易。)无论如何,一旦子模块提交存在且正确,您将要使用子模块中的git push
将这些提交发送到其origin
。您可以在将超级项目更新为
use
这些提交之前或之后执行此操作。只要记住,如果您确实要先更新超级项目,则在从超级项目中选择git push
之前,应确保先从子模块git push
。原因是其他想要您的新超级项目提交的人也将需要您的新子模块提交。