如何将修改后的子模块“ git添加”到主模块中?

格兰特·史密克

我修改,添加,提交并推送对子模块的更改,然后转到主模块目录并运行:

# 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但是,用于超级项目存储库的工作树确实具有一个目录(或文件夹,如果您更喜欢该术语,则包含该子模块.git1和工作树)。这意味着子模块的工作树是超级项目工作树的子目录。

您可以随时使用:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何重新加载修改后的内核模块

如何将更改恢复到git子模块?

如何将Git子模块指针还原为存储在包含存储库中的提交?

如何将子模块添加到github存储库

git要求提交子模块修改后的内容

Git子模块-从主仓库中拉出时如何保持子模块更新

如何将目录的子目录添加为git子模块?

您如何将git子模块固定到特定的哈希?

将代码组织到Git子模块中

在适配器上进行过滤后,如何将修改后的对象保留在列表中?

Angular-如何将模块导入子模块?

git submodule update <子模块的名称>-但仍被修改:<子模块的名称>(修改后的内容)

如何将git子模块导入NetBeans 8.1?

如何将子目录添加为git中的子模块

Angular 4-如何将值从父组件传递到子模块

如何将父模块中的模块导出到子模块

我已经修改了数据表中的数据。如何将修改后的数据放回表中?

如何修复在非主分支上提交的修改后的子模块引用?

如何将PyTorch子模块保持在评估模式?

对git子模块的个人修改

Git子模块的提交与主仓库中的标签匹配

如何将这些修改后的文件添加到.gitignore?

如何修改 Git 子模块使其附加到头部

如何将子模块导入父命名空间?

如何将新创建的页面 url 添加到修改后的 django-oscar

如何将子模块中的类/函数相互导入?

如何将传入流量重定向到模块到 Omnet++ 中的简单子模块?

修改后的模块的内置 reload() 无法正常工作

将git子模块中的更改推送到主模块但不推送到子模块