使用 Git 复制子模块

2024-03-27

我在 Git 中有一个项目,它有几个子模块,我需要下载这些子模块和可用的文件才能使用主项目,并且为了使子模块工作,我需要它们自己的子模块可用等等。为了进行设置,我使用递归地初始化子模块git submodule update --init --recursive.

但是,我注意到我的许多子模块都具有共享依赖项,在伪代码中看起来像这样(alpha -> beta代表着alpha有子模块beta)

my project -> submodule a -> submodule m
           -> submodule b -> submodule m
                          -> submodule n -> submodule x
           -> submodule c -> submodule x

我的问题是:是否有任何方法可以仅使用 git 来避免这种重复,同时仍然拥有每个子模块的文件(至少一份副本)?

我可以想象一个带有符号链接的解决方案,但如果 git 为我处理这个问题会更好,而且我不确定自己放入符号链接是否会在更新子模块时导致问题。

理想情况下,我想将其简化为:

my project -> submodule a -> symlink(submodule m)
           -> submodule b -> symlink(submodule m)
                          -> symlink(submodule n)
           -> submodule c -> symlink(submodule x)
           -> submodule m
           -> submodule n -> symlink(submodule x)
           -> submodule x

在此先感谢您的任何建议!


这不是内置在 git 中的,但是你绝对可以像你说的那样使用符号链接来做到这一点。您可能想看看git new-workdir http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/workdir/git-new-workdir;hb=HEAD(来自 git 的 contrib 目录),它基本上就是这样做的。它不知道与子模块有关的任何事情,但是子模块不知道它是子模块 - 它是父存储库知道这些东西。我还没有尝试过这个,但我相当确定你可以像这样使用它:

# remove the target first (new-workdir will refuse to overwrite)
rm -rf submodule_b/submodule_m

#               (original repo)         (symlinked repo)
git new-workdir submodule_a/submodule_m submodule_b/submodule_m

它的工作原理是对几乎所有 .git 目录进行符号链接;值得注意的是没有符号链接的是HEAD;这两个目录可以检出不同的内容,但共享相同的引用和对象。

从这里开始,你应该表现得很好。当你运行一个git submodule命令,它只是进入子模块并在那里运行适当的命令,这一切都会按预期工作。

对于像这样的符号链接存储库,您通常需要注意的一件事是它们共享同一组分支,因此如果它们都签出了相同的分支,并且您在其中一个中提交了它,则另一个将变得不可用同步。不过,对于子模块来说,这通常不会成为问题,因为除非您干预,否则它们本质上始终处于分离的 HEAD 状态。

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

使用 Git 复制子模块 的相关文章

  • 切换分支时发生致命 Git 错误

    错误信息 致命 git checkout 更新路径与切换分支 强制不兼容 如何解决这个 Git 签出错误 通过明确指定 git checkout HEAD blah 而不是仅仅说 git checkout blah 假设您确实想查看文件 然
  • 推送时出现 git 错误 来自服务器的空回复

    我一直在尝试对现有存储库进行新的更改 但是 我不断收到以下错误 MacBook Pro spa git push origin master XX 的用户名 致命密码 无法访问 https github com XXXX https git
  • 如何合并两个 Git 存储库?

    考虑以下场景 我在自己的 Git 存储库中开发了一个小型实验项目 A 它现在已经成熟了 我希望 A 成为更大的项目 B 的一部分 该项目有自己的大存储库 我现在想将 A 添加为 B 的子目录 如何将 A 合并到 B 中而不丢失任何一方的历史
  • 让 Git 确认之前移动的文件

    我不假思索地手动移动了一堆文件 并且找不到一种方法让 git 识别这些文件只是被移动 而不是实际上不同的文件 除了删除旧的并添加新的 从而丢失历史记录 或使用 git mv 重做所有更改之外 还有其他方法可以做到这一点吗 要让 git 删除
  • 在 Windows 上忽略 Git 存储库中的目录

    如何在 Windows 上使用 msysgit 忽略 Git 中的目录或文件夹 创建一个名为 gitignore在您的项目目录中 通过在文件中输入目录名称 附加斜杠 来忽略目录 dir to ignore 更多信息是here http gi
  • 重置远程跟踪分支

    如何将远程跟踪分支的分支指针重置为其之前的提交之一 这样看起来我没有拉动 类似于本地分支的硬重置 您可以使用以下命令设置对任何其他提交的引用 git update ref refs remotes origin master
  • gitk:悬停时显示分支名称

    你能告诉我如何让 gitk 工具在悬停时显示分支名称或建议能够这样做的工具吗 gitk 显示分支缠结 其中分支是无名的 我必须猜测哪个是 master 哪个是 stable 等 在 gitk 窗口的左下半部分 有一个信息行指定Branche
  • git clone 永远挂在 github 上

    当我按照 github 中的第 5 点 测试所有内容 时guide http help github com linux set up git ssh 命令也永远挂起 根据该指南 我应该看到一条消息 Github 不提供 shell 访问
  • Git 日志仅获取特定分支的提交

    我想列出仅属于特定分支的所有提交 通过以下内容 它列出了来自分支的所有提交 也列出了来自父级 主 的所有提交 git log mybranch 我发现的另一个选项是排除 master 可到达的提交并给我我想要的东西 但我想避免需要知道其他分
  • Git 工作流程和 Gerrit

    我正在尝试使用 Gerrit 实现 git flow 类型的工作流程 但我似乎无法弄清楚最后一块拼图 我的问题有两个先决条件 Gerrit 只会对一个分支执行合并 我不允许将合并提交推送到 Gerrit 更改获得批准后 合并必须由 Gerr
  • 使用 Capistrano 3 部署 git 子模块

    我的项目存储库包含 Wordpress 作为 git 子模块 通过 Capistrano 3 部署时 子模块目录是空的 project wordpress images 我正在使用 git 和 deploy via remote cache
  • 小型开发团队的 Git 分支策略 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们有一个网络应用程序 几乎每天都会更新和发布 我们使用 git 作为我们的版本控制系统 我们当前的分支策略非常简单且不完善 我们有一个主分支
  • 基于github仓库的本地仓库创建本地git仓库并保持更新

    我有一些基本的 git 知识 但我不知道如何实现这一点 我正在尝试克隆 github WordPress 入门主题下划线 https github com automattic s 这个想法是创建一个基本框架based 经过一些修改 在该存
  • 如何正确分叉本地 git 存储库?

    我有一个本地 git 存储库 我想分叉它并将其用作新项目的基础 新项目不应该将任何东西推回到原来的项目 这就是我的think我应该做 git clone originalproject newproject git remote remov
  • 将一些提交移至另一个分支

    我只有一个分支有 git repo A B C D E master 我想将提交 B C 和 D 拆分到另一个名为开发的分支 A E master B C D develop 做到这一点最简单的方法是什么 无需关心远程仓库 做cherry
  • 如何从分叉中签出 PR?

    我正在使用 github 托管一些项目 有人分叉了我的存储库并提交了 pr 我以前从未需要在 fork 中测试 pr 我如何检查分支并测试它 我可以如何将其放入我的仓库中吗 或者我应该检查分叉并以这种方式测试分支吗 您不需要访问叉子 只需使
  • 导入数千条记录后无法推送到 Heroku

    我有一个问题 我认为我的 sqlite3 数据库太大 我将大约 100 000 条记录导入到数据库中 并且能够 git Push 和 git Push heroku 现在我可能犯了一个错误 导入了太多记录 500 000 我能够推送到 gi
  • Git:确定分支是否处于合并冲突状态

    我正在编写一个 bash 脚本来进行一些自动化操作 该脚本的一部分涉及导航到本地存储库 切换到本地 master 分支 然后拉取远程 master 以使用最新代码更新本地 master 分支 有谁知道是否有一种方法可以以编程方式确定拉取是否
  • 如何解决22端口连接超时问题

    ssh connect to host bitbucket org port 22 Connection timed out fatal Could not read from remote repository Please make s
  • Sourcetree/GIT - 拉取时无法锁定引用/引用损坏

    我和一位同事在同一个分支上工作了一周 不断地推送 拉取更改 今天突然 我点击 拉取 以查看是否有任何需要拉取的更改 但出现了错误 顺便说一下 这是在 sourcetree 中的 错误是这样的 git c diff mnemonicprefi

随机推荐

  • jQuery 1.6.4 是否已损坏或发生了什么变化? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 它适用于
  • 以编程方式移动 xib 文件中的 UILabel

    Problem 我的 UILabel 在更改其帧信息后没有移动 但在使用 NSLog 输出后 帧信息与正确的位置匹配 但标签本身实际上并没有移动 更多信息 我正在尝试将 UILabel 移动到与 UITextField 相同的位置 两者都包
  • 动态更改列名

    我有一个标题 详细信息自定义屏幕 我在其中根据标题中的下拉选择来操作显示哪些网格列 这工作得很好 但现在我也想更改一些列名称 使用记录的语法 我无法让它工作 我看不出我做错了什么 似乎没有什么区别 我已经附加到进程并在这个事件上设置了一个断
  • 为什么在编译器选项中添加搜索目录后,标准库头内会报告错误?

    我在 CodeBlocks MinGW32 中有一个项目 其设置如下 Foo src somefile1 cpp Foo src somefile2 cpp Foo src somefile1 h 标头是这样包含的 include some
  • JSON.stringify 使用 Knockout JS 变量的对象

    当前场景 function Employee data var self this variables this Forename ko observable data Forename this Surname ko observable
  • __invert__ 方法

    目的是什么 invert 方法 我在探索 Python 内部结构时发现 gt gt gt dir builtins int abs add and bool ceil class delattr dir divmod doc eq floa
  • R - 图例中组合geom_vline和geom_smooth

    添加时我在图例中遇到一些奇怪的行为geom smooth and a geom vline 在我的 ggplot2 图表中 这是一个可重现的示例 library ggplot2 n lt 60 set seed 123 df lt data
  • 如何在给定角度的椭圆轮廓上获取点?

    因此 我给出了椭圆 它们由中点 水平半径 rh 和垂直半径 rv 定义 我使用 sin cos 绘制它们 结果对我来说看起来相当不错 只是确保这不是错误源 现在假设我有一个给定的角度 或方向向量 并且我希望椭圆轮廓上的点具有该角度 方向 我
  • 使用 XPath 选择根和子匹配表达式

    我正在使用 Nokogiri 来解析一些类似于以下内容的 XML
  • 自动调整 div 容器 html 中表格中的列大小

    我正在寻找一种解决方案 最好是在 css 或 html 中 以便我的位于 div 容器内的表格能够压缩其 以便在调整浏览器大小时它们保留在 div 容器内 http lux physicals ucdavis edu public new
  • 这个符号在 IntelliJ 中意味着什么? (文件名左下角红色圆圈,里面有“J”)

    在我创建的 Java 项目的 IntelliJ 的目标文件夹下 包中有一些 java 源文件 每个文件旁边的 J 图标都有一个红色圆圈 中间有一条线 这意味着什么 我如何解决它 您需要指定源目录 File gt Project Struct
  • 使用面板消息/解决方法时的 Java 1.5 JOptionPane 绘制错误?

    我有一个 JOptionPane 其中有一个自定义消息面板 位于面向 Java 1 5 的应用程序中 除其他内容外 该面板还包含一个 JTextField 每调用 20 次左右 对话框中就不会绘制任何内容 甚至 确定 取消 按钮也不会绘制
  • 让 docker-compose 只运行某些容器

    所以我目前可以使用 docker compose up test 它只运行我的数据库和测试脚本 我希望能够说 docker compose up app 或类似的东西来运行除测试之外的所有内容 这样我就不会运行不必要的容器 我不确定是否有办
  • 获取任意文件的二进制值

    如果假设我有一个文件 例如music mp3 or image jpg或任何要考虑的文件 我如何将这些文件的二进制表示形式转换为java中的字符串值 以便我可以查看它 例如 假设我有一个名为 video mp4 那么它必须表示为101011
  • Flask 和 Jinja2 使用漂白剂,图像 HTML 无法正常工作

    我一直在为自己的一个项目创建一个小博客 只有我作为用户才能访问发布页面 我之前一直在关注 Flask 教程 该教程的最终产品使您能够使用漂白剂和 Markdown 发布 HTML 并通过 Jinja2 模板传递它 In my models
  • Dockerfile 中的 AWS 凭证

    我需要在容器构建期间从 AWS S3 下载文件 但是我未能成功向构建过程提供 AWS 凭证 而无需将它们实际硬编码到 Dockerfile 中 我收到错误 docker 致命错误 无法找到凭据 尽管之前已经执行过 AWS 配置 此外 我无法
  • Intellij idea 中的 Ruby 设置

    这可能是显而易见的 但我无法在 Intellij 项目设置 编译器 插件等中找到 ruby 解释器路径以及任何其他可用的 ruby 设置 我确实安装了最新版本的 ruby 插件 并且使用的是 intellij 12 0 4 Ultimate
  • OOP 中的 php uasort

    class DBNews public function get latest posts limit code goes here posts array array uasort posts array this gt cmp publ
  • 在动作脚本 3 flex 4 中使用 DisplayObject(Group ,UIComponent) 剪切复制粘贴

    我正在我的应用程序中实现剪切复制粘贴 例如cacoo http www cacoo com 但我在这些操作过程中遇到问题 我正在使用剪切复制粘贴背后的想法 var className String getQualifiedClassName
  • 使用 Git 复制子模块

    我在 Git 中有一个项目 它有几个子模块 我需要下载这些子模块和可用的文件才能使用主项目 并且为了使子模块工作 我需要它们自己的子模块可用等等 为了进行设置 我使用递归地初始化子模块git submodule update init re