【问题标题】:Tweaking a submodule in Git [duplicate]在 Git 中调整子模块 [重复]
【发布时间】:2020-10-24 03:24:08
【问题描述】:

假设我有一个 repo parent 和一个 repo child,其中最新的是第一个的子模块。

我的child 存储库由第三方维护。我想跟踪这个第三方所做的最新更新,同时我也对这个子模块进行了自己的特定更改,以使其与我的父 repo 兼容。

这样做的正确方法是什么?

【问题讨论】:

    标签: git git-submodules


    【解决方案1】:

    这可能不是使用子模块最优雅的方式,但我有这种确切的情况,我通过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
    • @prosoitos : 这非常适合本地处理,你有办法分享你对子模块的本地克隆所做的更改吗?
    • 是的:我只是从 child 存储库中将它们推送到 origin(我的原始 child 存储库的分支)。当我处于这种情况时,我几乎将我的子模块视为嵌套的 Git 存储库。不过,我仍然将它们作为子模块保留(即使我没有完全从 parent 存储库管理它们),因为几乎没有什么好处。
    • @prosoitos : 好的(刚刚在你的答案中看到了origin/upstream 部分)
    • 是的。这是正确的。 Git 会自动将你的 fork 设置为 push/fetch 的默认远程,并将其命名为 origin。但是,您必须将第 3 方原始项目添加为 upstream,以便您可以从中提取(如果您想引入更新)。请注意,您也可以执行您所做的操作,然后使用 --set-upstream 标志重新设置哪个遥控器。但这不是经典的工作流程,为了安全起见,我会坚持使用常见的工作流程。
    【解决方案2】:

    This other question 提出了几乎相同的问题,并通过某种方式发布更改。这是另一种方法:

    如果您同意的话,另一种选择是,在您对 parent 的下一次提交中,停止将 child 作为子模块处理,并将其集成为您的 repo 的子树。

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2011-05-30
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多