【发布时间】:2020-10-24 03:24:08
【问题描述】:
假设我有一个 repo parent 和一个 repo child,其中最新的是第一个的子模块。
我的child 存储库由第三方维护。我想跟踪这个第三方所做的最新更新,同时我也对这个子模块进行了自己的特定更改,以使其与我的父 repo 兼容。
这样做的正确方法是什么?
【问题讨论】:
标签: git git-submodules
假设我有一个 repo parent 和一个 repo child,其中最新的是第一个的子模块。
我的child 存储库由第三方维护。我想跟踪这个第三方所做的最新更新,同时我也对这个子模块进行了自己的特定更改,以使其与我的父 repo 兼容。
这样做的正确方法是什么?
【问题讨论】:
标签: git git-submodules
这可能不是使用子模块最优雅的方式,但我有这种确切的情况,我通过cd-ing 到子模块中处理它,并从那里作为经典的 Git 存储库处理它。
这样,很容易将我自己的child 项目的fork 设置为origin,将原始child 项目设置为upstream。我可以从upstream 拉取原始项目(由第三方维护)的最新更新,进行自己的更改并将它们推送到origin 以便共享。
要更新 parent 存储库,我只需暂存并将更改提交到子模块。
为了知道在我提交这些更改时对 parent 项目中的子模块进行了哪些更改,我在我的 git 配置文件中有:
[diff]
submodule = log
这将在parent 项目中运行差异操作时显示子模块的日志。这不是必须的,但它很方便,因为我不必去子模块知道我做了什么等等。
您可以通过在 parent 存储库中运行 git config diff.submodule log 在本地进行设置,也可以使用 git config --global diff.submodule log 进行全局设置。
请注意,通过从父 repo 运行 git diff --submodule 而不是 git diff(如果您不想使用配置文件),您会得到相同的结果。
【讨论】:
parent 之前,请记住 git add /your/submodule/path
child 存储库中将它们推送到 origin(我的原始 child 存储库的分支)。当我处于这种情况时,我几乎将我的子模块视为嵌套的 Git 存储库。不过,我仍然将它们作为子模块保留(即使我没有完全从 parent 存储库管理它们),因为几乎没有什么好处。
origin/upstream 部分)
origin。但是,您必须将第 3 方原始项目添加为 upstream,以便您可以从中提取(如果您想引入更新)。请注意,您也可以执行您所做的操作,然后使用 --set-upstream 标志重新设置哪个遥控器。但这不是经典的工作流程,为了安全起见,我会坚持使用常见的工作流程。
This other question 提出了几乎相同的问题,并通过某种方式发布更改。这是另一种方法:
如果您同意的话,另一种选择是,在您对 parent 的下一次提交中,停止将 child 作为子模块处理,并将其集成为您的 repo 的子树。
【讨论】: