Git 子模块工作流程问题

2023-12-25

最近,我们的 Git 存储库遇到了很多问题。我们是应用程序之间总共 4 个共享存储库的 git 子模块的用户。

例如,存储库“网站”共有 3 个子模块。

[submodule "vendor/api"]
    path = vendor/api
    url = [email protected] /cdn-cgi/l/email-protection:api
[submodule "vendor/auth"]
    path = vendor/auth
    url = [email protected] /cdn-cgi/l/email-protection:auth
[submodule "vendor/tools"]
    path = vendor/tools
    url = [email protected] /cdn-cgi/l/email-protection:tools

我们已经正确检查了我们的主存储库“网站”。现在我的一位同事做了推动,然后我git pull; git status:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   vendor/api (new commits)
#   modified:   vendor/auth (new commits)
#   modified:   vendor/tools (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

mcfly@future:~/projects/website$ git diff

diff --git a/vendor/api b/vendor/api
index 41795fc..b582d80 160000
--- a/vendor/api
+++ b/vendor/api
@@ -1 +1 @@
-Subproject commit 41795fc4dde464d633f4c0f01eebb6ab1ad55582
+Subproject commit b582d802419b0ee7bc3959e7623fec0b94680269
diff --git a/vendor/auth b/vendor/auth
index a00369b..4599a71 160000
--- a/vendor/auth
+++ b/vendor/auth
@@ -1 +1 @@
-Subproject commit a00369bf29f14c761ce71f7b95aa1e9c107fb2ed
+Subproject commit 4599a7179c9b7ca4afa610a15ffa4a8fc6ebf911
diff --git a/vendor/tools b/vendor/tools
index f966744..c678cf6 160000
--- a/vendor/tools
+++ b/vendor/tools
@@ -1 +1 @@
-Subproject commit f966744359510656b492ae3091288664cdb1410b
+Subproject commit c678cf6f599fc450e312f0459ffe74e593f5890f

那有什么问题吗git diff?问题是每个子模块的新提交都比将被覆盖的提交更旧。这不是我们想要的,因为存储库上正确指向41795fc4dde464d633f4c0f01eebb6ab1ad55582, a00369bf29f14c761ce71f7b95aa1e9c107fb2ed and f966744359510656b492ae3091288664cdb1410b如果我们将这些修改添加到下一次提交中,我们可能会阻止这些事情。我不知道为什么它得到的是最旧的修订版而不是最新的修订版。

我尝试自己解决这个问题,但没有成功:

mcfly@future:~/projects/website$ git pull; git submodule foreach git pull

执行最后一个命令是不正确的,因为我们可能会将“网站”的指针更新为每个子模块的最新指针,而我们不希望这样做。我们希望保留存储库中的正确版本。

我必须解释的一件事是我们通常在这个子模块中工作,例如:

mcfly@future:~/projects/website$ cd vendor/api
mcfly@future:~/projects/website/vendor/api$ git checkout master
mcfly@future:~/projects/website/vendor/api$ echo "lorem ipsum" >> example.file
mcfly@future:~/projects/website/vendor/api$ git add example.file; git push

当我们做一个git submodule update每个子模块上的“master”分支都会丢失。

最后,正确的做法是什么push, pull并使用子模块并且没有所有这些问题?

先感谢您


看看git-scm 文档 http://git-scm.com/book/en/Git-Tools-Submodules并将其传递给您的团队。您所看到的现象在“克隆带有子模块的项目” http://git-scm.com/book/en/Git-Tools-Submodules#Cloning-a-Project-with-Submodules部分。

首先,您观察到的初始状态,其中git diff显示这些提交哈希值的意外相反结果,表示您在父存储库中合并了子模块更新,但未运行git submodule update本地。你必须跑git submodule update每次您在主项目中下拉子模块更改时。为什么?子模块的指针,即父存储库认为的状态vendor/auth,实际上不是HEAD子模块存储库的提交vendor/auth。在您了解 git 如何跟踪子模块状态之前,这有点令人困惑。再次,git-scm 文档 http://git-scm.com/book/en/Git-Tools-Submodules#Cloning-a-Project-with-Submodules值得一读。

Second, git submodule update放弃了master按设计在子模块上分支。查看“子模块的问题” http://git-scm.com/book/en/Git-Tools-Submodules#Issues-with-Submodules这些文档的部分。与 git 一样,手册页告诉我们需要了解的内容:

update
   Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will
   make the submodules HEAD be detached unless --rebase or --merge is specified or the key submodule.$name.update is set to rebase, merge or none.  none
   can be overridden by specifying --checkout.

您将子模块置于“分离”中HEAD' 每次发布时都声明git submodule update没有争论。

那么如何使用子模块而不出现这些问题呢?首先,问问你自己和你的团队:我们真的需要它们吗?在某些情况下,子模块是一个强大且有用的功能,但它们更多地是为第三方库设计的,而不是分解为子存储库的活动项目。您当然可以通过这种方式使用它们,但管理开销可能会很快超过您所获得的任何好处。除非您的存储库非常大,或者您的子模块完全模块化,否则值得一问“使用单一存储库会更好吗?” https://softwareengineering.stackexchange.com/q/161293/57052即使答案是否定的,请查看子树合并, http://git-scm.com/book/en/Git-Tools-Subtree-Merging这对于您的用例来说可能会更成功。

如果您仍然想使用子模块,请查看the docs http://git-scm.com/book/en/Git-Tools-Submodules#Issues-with-Submodules上面链接以及许多问题 https://stackoverflow.com/questions/1596822/git-submodules-workflow and answers https://stackoverflow.com/a/1979194/877115在 SO 和其他有关子模块工作流程的网站上。他们应该帮助您实现更明智的流程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 子模块工作流程问题 的相关文章

  • git stash 删除最旧的存储(比如最旧的 5 个存储)

    如何在一个语句中删除最旧的存储 例如最旧的 5 个存储 而不是执行以下操作 git stash drop stash 3 git stash drop stash 4 git stash drop stash 5 git stash dro
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git
  • 我在哪里? *(无分支)

    我已经熟悉了创建 合并和删除分支 我想知道我在哪里 这样我就不会将工作提交到错误的分支 我用git branch a看看我有哪些分支 我认为星号 显示我当前所在的分支 当我得到以下信息时 这意味着什么 no branch master or
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • GIT - 推送到 (GitHub) origin master 没有任何作用

    我已经分叉了某人的 GIT 存储库 https github com nippysaurus toodledo objc 将其克隆到我的本地计算机 显示带有以下信息的来源 remote origin Fetch URL https emai
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • TortoiseGit - 更改默认合并消息

    系统描述 Windows 7的 git版本2 10 1 windows 1 乌龟Git 2 3 0 0 I want 合并提交消息在不同的情况下有所不同fully自动方式 no manual amend Summary 在windows上
  • 如何让 git 显示作者日期指定日期范围内的提交?

    显然this https stackoverflow com a 11189286 281545 git log all after
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 创建多个 git 分支的联合分支

    我希望能够在现有分支之上分层其他分支 并独立修改这些分支 这很有用 例如 允许将各个子项目的二进制文件统一到同一个项目中bin目录 一般来说 给定的文件仅存在于一层中 理想情况下 我想我会使用 unionfs 来完成此任务 但它必须以某种方
  • 如何在现有裸存储库中创建引用日志信息

    您可能已经知道 默认情况下 git 不会为新的裸存储库启用引用日志更新 问题是 我有一个很长的历史存储库 但它是在我设置 logAllRefUpdates 标志之前创建的 现在我希望其他应用程序可以使用该信息 如何通过对现有存储库进行最少的
  • Git - 使用过滤器分支删除带有空变更集的提交

    如何使用 git filter branch 删除没有变更集的提交 我使用以下方法重写了我的 git 历史记录 git filter branch tree filter rm r f my folder f HEAD 效果很好 但现在我有
  • 使用nodegit切换分支/标签

    我整个早上都在尝试打开现有的存储库并使用 nodegit 更改分支或标签 文档内容很丰富 但似乎已经过时了 关于我做错了什么有什么想法吗 var NodeGit require nodegit var open NodeGit Reposi
  • git 清除远程仓库

    如果我将错误的初始提交 或多个 推送到远程存储库 并且只想清除 销毁它 我可以通过命令来完成吗 将其从服务器中完全删除非常重要 这样它就不会占用磁盘空间 例如 今天我推送了一个完整的 Visual Studio 项目 其中包含 dll sd

随机推荐

  • 导入 @material-ui/pickers 时未捕获类型错误:Object(...) 不是函数

    我在用 material ui core 3 9 3 with material ui pickers 3 0 0 beta 1 当我从以下位置导入任何东西时 material ui pickers I get Uncaught TypeE
  • 将 NETBIOS 域转换为 FQDN(完全限定域名)

    简而言之 如何将 NETBIOS 域转换为 FQDN 细节 假设我位于域 A 中 并且拥有域 B 的用户凭据 该域 B 与域 A 具有信任关系 我可以对凭据进行身份验证 当我拥有的只是该域中某个经过身份验证的用户的凭据 包括 netbios
  • Javascript 是否可以创建外部闭包?

    通常 要创建闭包 您可以在另一个函数中创建它 并且它获取其父函数的范围 var parent function var a works var subfunction console log a works subfunction 我试图找
  • 直接与委托 - jQuery .on()

    我试图理解两者之间的这种特殊区别direct and 委托的事件处理程序使用jQuery on method http api jquery com on 具体来说 本段最后一句 When a selector提供后 事件处理程序被称为委托
  • 如何使用 Delphi 检测 Android 中的虚拟键盘事件

    我正在尝试使用 Rad studio Xe5 和 Delphi 开发 Android 应用程序 但遇到以下问题 屏幕底部有一个 Tmemo 按下它输入一些文本时 虚拟键盘会显示在我看不到的 Tmemo 上 我想检测显示键盘上的事件并移动更改
  • Vue Bootstrap 4中的三列复选框

    任何人都可以帮我通过 bootstrap 4 中的 vue js 实现 3 列布局吗 我想让我的复选框显示为 3 列 用户按顺序排列 我希望顺序从第一列开始 然后是第二列 最后是第三列 div div class div div
  • 如何获取处于“准备”状态的 docker 服务任务的日志

    我现在正在使用 docker 1 12 创建了一个服务 并注意到有一个阶段 preparing 当我跑的时候 docker service tasks xxx 我只能猜测在这个阶段图像正在被拉取或更新 我的问题是 如何查看此阶段的日志 或者
  • Sails.io.js io.socket.get('/user',...) 尚未在核心中实现

    创建例如assets js dependencies app io js with io socket on connect function socketConnected console debug This is from the c
  • php中session.use_cookies的使用

    我已经四处搜索以查找如果更改值对 php 会话的影响session use cookies to true or false但似乎对其工作方式没有影响 有什么用session use cookies在 php 中以及为什么需要它 这就是您希
  • ASP.NET MVC Remote属性方法参数总是传递null

    我有这个AdvertiserNameAvailable远程验证属性正在使用的方法 问题是AdvertiserNameAvailable正在调用而不将输入值传递给方法Name范围 当我进入该方法的调试时 我看到Name参数总是null pub
  • 如何在 GitHub Actions 中缓存 dotnet 安装

    我的 CI 管道中有两个步骤 一是缓存dotnet的安装路径 二是dotnet安装 并使用 windows 2019 图像 但系统永远不会识别 net 7可用 它始终安装 net 6 0 缓存还显示缓存了 200MB 但可能某些 PATH
  • 如何处理 iPhone 中 uitableviewcell 上每个按钮的切换按钮

    我的代码运行良好 但仅适用于单个单元格 当我定义 5 行时 它仅适用于最后一个单元格 如果我点击 1 个单元格 则值displayimage仅在最后一个单元格上 它不显示我单击的位置以及我单击的单元格如何处理每个单元格的toogle按钮更改
  • 为什么我要使用 Enumerable.ElementAt() 而不是 [] 运算符?

    这似乎是一个愚蠢的问题 但我还没有找到答案 所以就在这里 在这两种情况下 如果您未能检查集合的边界 您将收到 超出范围 异常 这只是编码风格偏好吗 如果有人需要一个例子 List
  • 制作平台游戏,需要方法停止运行

    我正在用 Flash 制作一个平台游戏 我有一个目标类 该类包含目标精灵的代码 当你击中它时 它会继续游戏的下一部分 在目标构造函数内部 添加了2个事件监听器 它们如下 addEventListener Event ADDED beginC
  • 如何在Boost Spirit中设置最大递归

    使用 boost spirit 如果我有递归规则来解析括号 rule
  • Java - 等待和notifyAll

    当你对一个没有等待的对象调用notifyAll方法时会发生什么 应该有例外还是正常情况 正如您在这里所看到的 对未等待的对象调用notifyAll 不会产生任何效果
  • 如何在 Symfony2 数据库查询中使用 MATCH

    我正在为我的 Symfony2 项目构建一个搜索功能 并为其编写了 SQL 如下所示 SELECT dlc title dlc description dlc keywords FROM ShoutMainBundle Dlc dlc WH
  • 测量外部 CDN 资源的访问者 HTTP 缓存命中率

    我的网站使用几种常见的 CDN 托管资源 例如bootstrap css jquery js and fontawesome css 是否可以通过 JavaScript 获取信息 我的网站访问者在其 Web 浏览器中是否有这些资源的热缓存
  • 以编程方式更改本地安全策略

    我想在 C 中更改本地安全策略 交互式登录 不需要 ctrl alt del 我怎样才能做到这一点 我找到了我必须在注册表中更改的答案 Windows 注册表编辑器版本 5 00 HKEY LOCAL MACHINE SOFTWARE Mi
  • Git 子模块工作流程问题

    最近 我们的 Git 存储库遇到了很多问题 我们是应用程序之间总共 4 个共享存储库的 git 子模块的用户 例如 存储库 网站 共有 3 个子模块 submodule vendor api path vendor api url emai