子 git 存储库作为主存储库的子集

2024-05-10

我正在寻找一种方法来设置 git 存储库,其中包括来自较大存储库的文件子集,并从该主存储库继承历史记录。我的主要动机是能够通过 GitHub 共享代码子集。

我目前通过单个 git 存储库管理我的研究相关(主要是 Matlab)代码。代码本身松散地组织成几个文件夹,代码依赖关系通常跨文件夹。我不想上传整个存储库的远程副本,因为它包含许多其他人不想要的完整项目。

我对此的想象是每个项目都有一个单独的存储库,该存储库仅跟踪该项目的相关文件,但继承了主存储库的所有提交。理想情况下,我希望能够在这些子存储库中标记版本,与主存储库分开,但这不是必需的。我研究了 git 子模块、子树和 gitslave,但所有这些似乎都假设子项目是独立的文件集合,而在我的情况下,许多子项目与其他子项目共享文件。我还尝试创建一个特定于项目的分支,git rm-ing 不相关的文件,但是当我需要将主分支的更改合并到项目分支中时,它就崩溃了(由于项目删除的文件的更改而导致混乱)。

统计数据:

  • 主存储库中有 8096 个文件
  • 我想分享的 14 个子项目
  • 这些子项目中共有 394 个文件
  • 276个文件只属于1个项目,57个属于2个,60个属于3个,1个到6个。

目前,我通过简单地将每个项目的相关文件定期复制到新文件夹来共享代码。但这意味着新副本没有附加提交历史记录。是否有更可靠的方法来共享这些不同的代码子集,并使它们与我所做的更改保持同步?


据我了解你的问题

  • 你有一个包含多个子项目的大仓库
  • 您想要提取并共享每个子项目作为其自己的存储库,仍然包含(仅)该子项目的历史记录/提交
  • 子项目共享一些文件=>这意味着一个子项目使用的文件并不严格包含在单个子目录中,因为一个文件可能在多个子项目中使用,这就是为什么你不能简单地使用git subtree or git submodules

将文件子集的历史记录提取到专用分支(然后您可以将其推送到专用存储库)的一种方法是使用git filter-branch:

# regex to match the files included in this subproject, used below
file_list_regex='^subproject1/|^shared_file1$|^lib/shared_lib2$'

git checkout -b subproject1 # create new branch from current HEAD

git filter-branch --prune-empty \
  --index-filter "git ls-files --cached | grep -v -E '$file_list_regex' | xargs -r git rm --cached" \
  HEAD

这会

  • 首先创建一个新分支subproject1基于当前的HEAD (git checkout -b subproject1)
  • 遍历它的整个历史(git filter-branch [...] HEAD)
  • 删除所有文件(xargs -r git rm --cached)那是not子项目的一部分(git ls-files --cached | grep -v -E '$file_list_regex')
  • 所有未触及子项目文件之一的提交都将从该分支中​​删除(--prune-empty).
  • 此操作不会签出每个修订版本,而是仅对索引进行操作(--index-filter/--cached).

虽然这是一项一次性操作,但据我了解您的问题,您希望使用新的提交不断更新提取的子项目存储库/分支。 好消息是您可以简单地重复此命令,因为git filter-branch将始终为您的子项目分支生成相同的提交/历史记录 - 假设您不手动更改它们或重写您的主分支。

这样做的缺点是这会filter-branch the complete历史每一次并为每个子项目一次又一次。 鉴于您只想添加最后 5 次提交master分支到现有的尖端subproject1分支你可以像这样调整命令:

# get the full commit ids for the commits we consider
# to be equivalent in master and subproject1 branch
common_base_commit="$(git rev-parse master~6)"
subproject_tip="$(git rev-parse subproject1)"

# checkout a detached HEAD so we don't change the master branch
git checkout --detach master

git filter-branch --prune-empty \
  --index-filter "git ls-files --cached | grep -v -E '$file_list_regex' | xargs -r git rm --cached" \
  --parent-filter "sed s/${common_base_commit}/${subproject_tip}/g" \
  ${common_base_commit}..HEAD

# force reset subproject1 branch to current HEAD
git branch -f subproject1

解释:

  • 这只会重写最后 5 次提交(git filter-branch [...] ${common_base_commit}..HEAD) up to master~6我们认为这相当于承诺subproject1当前提示。
  • 对于这些提交(第一个),它将重写其父级master~6 to subproject1 (--parent-filter 'sed s/${common_base_commit}/${subproject_tip}/g')有效地重新调整 5 个重写的提交subproject1.
  • 最后我们只需要更新subproject1将新的提交包含在其之上。

进一步优化/自动化:

  • 实现更好的逻辑来列出您想要包含的文件($file_list_regex) 或实际上排除 (git ls-files --cached | grep -v -E '$file_list_regex') 来自给定的子项目
  • 使要包含的文件列表取决于当前提交($GIT_COMMIT)或将列表签入存储库本身,以防每个子项目包含的文件可能随着时间的推移而改变
  • 找到一种自动方法来查找当前主项目中子项目分支提示的“等效”提交
  • 将所有内容组合在一个漂亮的 git 别名中,这样你就可以简单地使用git update-project subproject1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子 git 存储库作为主存储库的子集 的相关文章

  • GitHub - 指定时间的存储库状态

    我是使用 git 版本控制工具的初学者 我想在指定时间 例如 2013 年 10 月 5 日 下载存储库状态 文件 我怎样才能做到这一点 截至 2019 年 5 月 不确定何时引入 您可以简单地按以下格式添加日期 HEAD 2019 04
  • 警告:引用名称“xxx”不明确

    我想知道为什么我收到 refname is ambigeous 的警告 这是否意味着名称以该字符串开头的分支不超过两个 但这里没有 Thanks git checkout B03799 warning refname B03799 is a
  • Jenkins groovy - 如何从最新提交中检索标签?

    从中获取最新提交branchName 我们运行下面的代码 treeMapData git branch branchName credentialsId credential url gitLabServer projectName rep
  • Git rebase --继续而不打开编辑器

    调用时git rebase continue在正常的变基冲突之后 编辑器 GIT EDITOR 打开并要求修改提交消息 因为提交消息可能包含前导 所以这可能会失败 export GIT EDITOR true git rebase cont
  • 将主分支的提交合并到另一个分支,但不合并两个分支

    我有 git 存储库和一个主分支 我决定开发新功能 并且创建了新分支 new branch 我已经在 new branch 中创建了一些提交 但我还没有完成新功能 我决定修复 master 分支中的一些错误 因此我切换到 master 分支
  • gitattributes 中的`* text=auto eol=lf` 会做什么?

    我们的 gitattributes 文件中有这样的内容 text auto eol lf 我想准确理解这是做什么的 第一部分是text auto 来自文档 http git scm com docs gitattributes 这确保了所有
  • 从预提交挂钩中排除某些文件类型

    我想要一个预提交 git 钩子来检查 如果可能的话 自动删除 尾随空格 In 让 git 在提交之前自动删除尾随空格 https stackoverflow com questions 591923 make git automatical
  • 如何在 git 交互式 rebase 中将提交与下一个提交合并?

    git rebase i允许通过以下方式将提交与前一个提交合并squash or fixup 这两个选项都需要至少一次提交pick ed 当一个人想要使用第一个提交但丢弃其提交消息时 情况怎么样 换句话说 如果我希望第一个提交与后续提交合并
  • git log --oneline 提供在管道或重定向到文件时丢失的 HEAD 信息

    当我执行没有管道或文件重定向的 git log oneline 命令时 它会提供有关 HEAD 位置和分支的信息 下面示例中的 master git log oneline color never 8bc8511 HEAD gt day 2
  • 在 gitHub 网站上哪里可以查看提交历史记录?

    我正在 gitHub 上寻找所有过去 git 提交的历史记录按钮 这些是 gitHub 页面上的按钮 代码 问题 拉取请求 行动 项目 维基百科 安全 见解 设置 1 家分店 0 标签 在存储库页面上 大绿色下拉代码按钮下方有一个提交按钮
  • git commit -m 与 git commit -am

    看起来很容易 但我就是不明白 我在我的应用程序的根目录中 这是我的工作流程 git add git commit m added a new feature some files changed git push heroku master
  • Git 和重定向

    我注意到 当 git html 项目页面如下所示 https github com fruux sabre dav 被克隆 以这种方式 git clone https github com fruux sabre dav 实际生成的远程 U
  • 显示 GitHub 上二进制文件的文本差异

    我正在尝试使用 Git 和 GitHub 同步多个应用程序配置文件 这些是以二进制格式存储的 XML 或 plist 文件 例如 一个键盘大师 kmsync file https forum keyboardmaestro com t pl
  • 如何正确设置 Azure DevOps 和 GitHub 之间的双向同步

    我想通过执行以下操作在 Azure DevOps 和 GitHub 之间创建双向同步 使用 CI 触发器创建 Azure DevOps 管道 将更改从 Azure DevOps 存储库推送到 GitHub 中的分支 创建第二个管道 用于侦听
  • 在防火墙后面使用 GitHub,无需 SSH 访问

    我真的很想使用 GitHub 但我的公司一切都被锁定了 现在 我只能通过HTTP协议使用Tortoise SVN 我可以以同样的方式使用 GitHub 吗 如果是这样 怎么办 我认为你一直能够克隆github https github co
  • Eclipse git checkout(又名恢复)

    是否可以做相当于git checkout在 Eclipse 中使用 Egit 插件 我有一个已修改的文件 我想放弃更改并将文件恢复到源存储库中的内容 在 Subversion 中 这称为恢复 在 git 中 相当于 checkout 我在团
  • 自给定提交以来 git 中的作者列表

    我想要一种列出所有 git 作者的方法 仅自给定提交以来 是独特的 这两个很简单 我在网上看到过一些解决方案 大多数使用git log format 但我看到的都不符合附加要求 按提交日期排序 因此 如果约翰 史密斯 John Smith
  • 未找到 Gradle DSL 方法:“versionCode()”

    构建我的 Android 项目时遇到问题 我使用Grgit https github com ajoberstar grgit填写versionCode and versionName在 gradle 中 一切工作正常 直到我将 Andro
  • 切换到工作区并在 Xcode 中添加 CocoaPods 后提交 git 吗?

    我刚刚在 Xcode 5 中将 CocoaPods 添加到我当前的项目中 当然 CocoaPods 创建了一个工作区 并且我已在 Xcode 中启动了该工作区 我在工作区中看到了我的项目和 Pods 项目 我的项目从第一天起就处于源代码控制
  • 配置 Eclipse/EGit 来跟踪上游存储库

    我正在使用 EGit 如新的 Eclipse 4 2 Juno 版本中提供的 我在 GitHub 上有一个存储库 是从另一个上游存储库分叉的 当我从 Github 上的存储库在 Eclipse 中创建项目时 它正确设置origin指向 Gi

随机推荐

  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何从 JavaScript 触发 ASP.NET Core 客户端验证

    有没有办法从 JavaScript 触发 ASP NET Core 客户端验证 我有一个 Razor Pages 页面 其中包含
  • 从控制台应用程序隐藏控制台窗口[重复]

    这个问题在这里已经有答案了 我有一个使用控制台的应用程序 但我更改了所有代码以写入文件而不是控制台 我现在希望在运行应用程序时控制台停止出现 我该怎么做呢 我不知道是什么首先打开了控制台 即使代码中没有写入任何内容 我查看了应用程序引用 但
  • 同时调用多个支持 bean 方法

    有没有办法从 JSF 中的不同支持 bean 调用多个方法 我有一个存储用户信息的应用程序 我有多个支持 bean 它们分为时间表 地址 电话等 当应用程序最初加载时 一切正常 但由于我的所有视图都是类型 ViewScope即使显示新用户
  • Visual Studio退出调试,没有任何异常或错误

    我有一个TCP CLIENT游戏服务器项目在视觉工作室2010 当我在调试模式下启动项目时 需要一段时间 有时 1 天 有时 1 周 视觉工作室退出调试 没有任何异常或错误 我检查了窗口和应用程序日志 没有什么意外的 如何找出真正的问题是什
  • 生成的表的行跨度导致额外的单元格

    HTML table border 1 cellspacing 1 width 100 thead tr td class csstextheader width 70px td td class csstextheader width 7
  • jQuery 无法在外部 JavaScript 中工作

    我是 jQuery 新手 遇到了一些奇怪的问题 我正在使用 jQuery 的change and click方法 在我的 HTML 文件中使用时它们工作正常
  • Python 2.7 布尔运算符逻辑

    我目前正在学习Python 2 7 并且遇到了相等和布尔运算符 我的问题是 Why False and 1 is False but True and 1 is 1 同样地 False or 1 is 1 but True or 1 is
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • Visual Studio 2013删除已删除的git分支

    我遇到这个问题 在 VS2013 中 当我从源创建一个新分支时 源分支的下拉列表列出了曾经创建的所有分支 这包括长期从本地存储库和远程 源存储库中删除的分支 如何删除已删除的分支 Visual Studio 将它们保存在本地缓存中 您可以从
  • 提供软件设置的最佳方式?

    我正在使用 C NET 在我的软件中 我提供设置对话框 用户可以通过该对话框设置我想要保存到文件的应用程序设置 要求 典型 我定义的每个类都使用这些设置的某些部分 因此 这些对于所有类都应该是全局的 这些应该在软件启动时加载 当用户更改设置
  • 在 python 的 Visual Studio 工具中按下 ctrl+F5 后,控制台窗口立即关闭

    我已经安装了 Visual Studio 的 Python 工具 但在控制台窗口中看不到输出 就像我在 Visual Studio 中运行 C 控制台应用程序时按以下快捷键时看到的输出一样 F5 开始调试程序并关闭 C 和 Python 中
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • 如何使用.net更改selenium中的用户代理

    我想使用不同的代理 iPhone iPad Android 测试用 NET 编写的 Web 应用程序 我使用 NUnit 和 Selenium 进行测试 有人有一个用 c 或 VB 在 Selenium 中更改代理 例如 iPad 或 iP
  • 如何使用 LeafLe 创建商店地图

    我希望创建一个可以交互的地图 我发现的最好的选择是传单 问题是我没有找到任何资源来解释如何创建自己的地图 我希望创建一个商场地图 用户可以在其中看到所有商店 喷泉 我怎样才能做到这一点 最好的起点是传单示例页面 http leafletjs
  • 如何从二叉搜索树中均匀随机地返回节点?

    给定一个 BST 可能平衡也可能不平衡 如何能够均匀地随机返回 任何 节点 一个限制是您不能使用外部索引数据结构 您必须以每个节点都有平等被访问的机会的方式遍历树 这个问题让我困惑了好一阵子 如果我们确实可以使用外部哈希表 指针 我们可以对
  • 禁用显示控制台窗口

    我可以在哪里禁用 Microsoft Visual C 显示控制台窗口 在您的控制台应用程序中 转到 Properties gt Linker gt System change SubSystem to Windows 并在你的代码中 代替
  • 如何在依赖注入之外构造对象?

    我有很多使用依赖注入来注入对象集合的服务 如下所示 IRepository
  • 子 git 存储库作为主存储库的子集

    我正在寻找一种方法来设置 git 存储库 其中包括来自较大存储库的文件子集 并从该主存储库继承历史记录 我的主要动机是能够通过 GitHub 共享代码子集 我目前通过单个 git 存储库管理我的研究相关 主要是 Matlab 代码 代码本身