Git 命令自动子树合并项目与子模块?

2023-12-19

I found 使用 Git,子树合并具有子模块的外部项目的最佳方法是什么? https://stackoverflow.com/questions/645019/using-git-whats-the-best-way-to-subtree-merge-an-external-project-that-has-subm但虽然相关,但它并没有回答我的问题。

假设我有我的父项目和子项目,其中包含子模块。如何将子项目子树合并到父项目的子目录中并保持对子模块的引用有效?

我尝试过类似的事情:

git remote add -f child_remote git://github.com/me/child.git
git checkout -b child_branch child_remote/master
git submodule init
git submodule update
git checkout master
git read-tree --prefix=child_directory/ -u child_branch

但是 read-tree 丢失了子模块,并且 .gitmodules 仅出现在子目录中。当我尝试执行 git submodule init 和 git submodule update 时,我收到类似“在 .gitmodules 中找不到路径 'child_directory/submodule_directory' 的子模块映射”之类的错误。

我也尝试修改说明http://help.github.com/subtree-merge/ http://help.github.com/subtree-merge/使用子模块,但无济于事。

我知道我可以通过手动修改 .gitmodules 文件以引用正确的路径,或者在没有子模块的情况下合并到子项目中,然后将它们重新添加到父项目中来实现此目的,但我认为这两种解决方案都是黑客。我正在寻找可以运行的实际命令,以使其自动工作,而无需手动编辑任何内容。


您可以更改 .gitmodules 中的路径,然后执行git submodule init && git submodule update或者您可以将子模块转换为子树。最后一个选项涉及某种脚本,因为没有自动方法来执行此操作。

使用 shell 脚本时,您可以使用这些函数来获取子模块及其名称(来自 git-submodules 源):

# This lists the unmerged submodules
module_list()
{
    git ls-files --error-unmatch --stage -- "$@" |
    perl -e '
    my %unmerged = ();
    my ($null_sha1) = ("0" x 40);
    while (<STDIN>) {
        chomp;
        my ($mode, $sha1, $stage, $path) =
            /^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/;
        next unless $mode eq "160000";
        if ($stage ne "0") {
            if (!$unmerged{$path}++) {
                print "$mode $null_sha1 U\t$path\n";
            }
            next;
        }
        print "$_\n";
    }
    '
}

# This gets the submodule's name from the .gitignore file in your webroot
module_name()
{
    # Do we have "submodule.<something>.path = $1" defined in .gitmodules file?
    re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
    name=$( git config -f $2/.gitmodules --get-regexp '^submodule\..*\.path$' |
        sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
    test -z "$name" &&
    die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$path'")"
    echo "$name"
}

然后,当您迭代结果时,您可以提取用于子树的名称和 url。

module_list | while read mode sha1 stage path
do
    #the path as your repo sees it
    full_path=$path

    #The path as .gitmodules in your child_directory sees it
    fake_path=${path[*]/[child_directory]\//}

    #Get the name of the submodule
    stupid_name=$(module_name "$fake_path" "[child_directory]")

    #Get the git URL from the .gitmodules file
    git_url=$(git config -f [child_directory]/.gitmodules submodule."$stupid_name".url)

    #Gets the clean name to use as remote name
    new_remote=$(echo $git_url | cut -d. -f2 | cut -d/ -f2- | cut -d/ -f2)

    #Remove the submodules folder
    rm -rf $path 

    #Add the subtree
    git remote add -f $new_remote $git_url
    git merge -s ours --no-commit $new_remote/master 
    git read-tree --prefix=$full_path/ -u $new_remote/master
    git commit -m "$new_remote merged in $full_path"
done 

我确信有一种更好的方法可以做到这一点,但它给出了要做什么的想法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系: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 扩展 - 无法在 Windows 上推送到网络驱动器中的 git bare 存储库

    我正在 Windows 上学习 git 我已经安装了 Git 扩展 版本 2 47 3 并使用了它 我在我的 C 单元中创建了一个裸存储库 作为中央存储库 并在硬盘中的其他任何位置创建了个人存储库 我对硬盘中的这两个存储库进行提交 推送和拉
  • 如何升级 Windows 中 git svn 使用的 SVN 版本?

    我的公司正在将SVN升级到1 7 检查git svn version显示正在使用的SVN版本是1 4 6 我想获得 git svn 使用的 SVN 版本接近 1 7 但是 我没有看到有关更新 git svn 使用的 SVN 版本 在 Win
  • gitlab 请求将分支 A 合并到开发中(落后 3 次提交)我应该担心吗?

    在 gitlab 中创建合并请求时 我经常收到一条消息 请求将分支 A 合并到开发中 x 提交落后 gitlab想告诉我什么 我应该担心还是需要修复某些东西 什么 一段时间后合并请求在项目中打开时 由于其他人合并了自己的更改 您尝试合并到的
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 我可以忽略全局 .gitignore 吗?

    我的全局 gitignore 一般都很棒 但对于这个一次性项目 我不希望应用全局规则 如何删除这个怪异存储库的全局 gitignore 规则 在您的存储库中运行此命令 git config local core excludesfile f
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一
  • Spring Cloud Config - 不允许使用 git-upload-pack

    我有一个在 docker 环境中运行的 spring boot 应用程序 它连接到 Git 存储库以获取应用程序的配置 我的问题是 当尝试获取 properties 文件时 应用程序有时会出错 这很奇怪 因为如果我更改用户和密码 同一个应用
  • 如何停用 Xcode git 功能? (删除 git 集成)

    我的 Xcode 项目位于 git 上 但我不喜欢 Xcode git 集成 有时 我有来自 Xcode 的错误 https stackoverflow com questions 7388560 error fatal not a git
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • 在种子项目上构建时如何组织 git 存储库

    我正在基于从 github 克隆的种子项目 MEAN io 构建一个网站 如何将这些文件与我自己的文件分开 由于该种子提供了广泛的文件框架 因此我自己的文件分布在整个项目中 我希望能够从种子中提取更新 但不能将其与我添加的文件混合 我知道我
  • 如何在源代码管理中存储 Visual Studio 的调试配置

    Visual Studio 的调试配置存储在 user文件是用户特定的并且传统上被源代码管理忽略 我对工作目录参数感兴趣 我需要它在程序员的机器上保持一致 并且它具有以下价值 outDir而不是默认的 ProjectDir 我怎样才能解决这
  • git am 和 git apply 有什么区别?

    Both git am https git scm com docs git am and git apply https git scm com docs git apply可用于应用补丁 看起来git am自动提交 而git apply
  • 是否可以从 Github 网站或 API 获取分支合并列表?

    在我们的工作流程中 不会 直接 提交到主分支 主分支仅接收来自 Pull 请求的合并 我们可以将每次合并视为添加到主分支的新功能 因此 我想获得一个合并到 master 中的列表 作为一种可视化随着时间的推移添加到产品中的功能块的方式 gi
  • Git - 使用过滤器分支删除带有空变更集的提交

    如何使用 git filter branch 删除没有变更集的提交 我使用以下方法重写了我的 git 历史记录 git filter branch tree filter rm r f my folder f HEAD 效果很好 但现在我有
  • git rebase 吃了我的提交!为我翻译“git reflog”输出?

    我已经完成了五次提交 我想在推送它们之前将它们全部合并为一次提交 出于某种原因 我决定尝试通过与通常使用的不同的方式来做到这一点 FWIW 我试图按照此处的说明进行操作http gitready com advanced 2009 02 1
  • 使用nodegit切换分支/标签

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

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

随机推荐

  • “请求中的 URI 无效”尝试代理 iframe 内容以进行本地调试

    我正在尝试调试包含 iframe 的页面中的问题 为父页面提供服务的网站是我正在处理的代码 我可以轻松地在本地运行 但 iframe 的内容来自我无权访问的代码 有一些保护措施会阻止跨域 iframe 这在生产中不会成为问题 因为它们将在同
  • 如何在Linux上后台无限运行脚本?

    我有一个带有无限循环的 PHP 脚本 我需要这个脚本永远运行 所以 我跑 php path to script php gt dev null 它在我当前用户的安全上下文中在后台运行 但是当我关闭终端窗口 注销 时 CentOS Linux
  • 从命令行运行 PyCharm 项目

    我正在尝试将我的项目部署到服务器并在那里运行它 当我尝试从命令行启动脚本时 它显示错误 导入父目录中的脚本时 我使用 PyCharm 制作了该项目 python 2 7 10 并将其分散到多个目录中 这些文件夹看起来像这样 项目 dir s
  • 匹配澳大利亚商业号码 (ABN) 的正则表达式

    我需要一个正则表达式来匹配一个值 其中每个字符可以是 0 到 9 之间的数字或空格 该值必须恰好包含 11 位数字 例如 它应匹配格式为 012 345 678 90 或 01234567890 的值 有人可以帮我解决这个问题吗 为了将来可
  • Camunda 使用 REST 获取 XOR 网关的机会

    I have the following situation 我想要做的是在我的 Angular 应用程序中获得一个下拉菜单 其中列出了书籍的所有机会 所以我可以在 哈利 波特 白鲸记 和 鲁宾逊漂流记 之间进行选择 当我选择一本书并按提交
  • 沙盒 AppDomain 中的线程安全

    我有一个应用程序域来托管不受信任的代码 程序集 我用安全属性解决了所有安全问题 效果很好 不受信任的代码在专用线程上运行 CLR 是 2 0 这就是我所拥有的应用程序域Shell http code google com p robocod
  • 在实践中(而非理论上),小批量与实时流有什么区别?

    在实践中 而非理论上 小批量与实时流有什么区别 从理论上讲 我理解迷你批次是在给定时间范围内进行批处理的东西 而实时流更像是在数据到达时执行某些操作 但我最大的问题是为什么不使用带有 epsilon 时间范围 例如一毫秒 的迷你批次或者我想
  • 为什么 Firefox 即使输入不同的名称也会自动完成?

    或者 Firefox 如何确定密码 用户名的去向 如果我更改输入元素的名称 id 标题 类 Firefox 会继续用密码或电子邮件填充它 如果我正确理解 Firefox 的源代码 浏览器首先会在表单中查找密码字段 如果表单包含超过 3 个密
  • 使用 Dropout 时的验证损失

    我试图了解辍学对验证平均绝对误差 非线性回归问题 的影响 无辍学 辍学率为 0 05 With dropout of 0 075 在没有任何 dropout 的情况下 验证损失大于训练损失 如下所示1 https i stack imgur
  • 如何解压缩特定文件夹?

    如何使用 Ant 解压缩特定文件夹 具体来说 我下载了 apache tomcat 6 0 29 zip 其中包含文件夹 apache tomcat 6 0 29 我希望 Ant 解压 apache tomcat 6 0 29 下的所有内容
  • Gitlab CI部署AWS EC2

    我们有一个 lumen 应用程序 我们将项目移动到 GitLab 如果一切正常 我们想拉取该项目 我们添加两个脚本 gitlab ci yml variables All or variables stages test productio
  • airflow postgresql 后端:(psycopg2.OperationalError)致命:用户“airflow”的身份验证失败

    尝试在centos7机器上使用postgresql作为airflow v1 10 5 的后端 在本文之后 https www ryanmerlin com 2019 07 apache airflow installation on ubu
  • 带有 persistence.xml 的 Intellij JPA 控制台

    我正在使用 Intellij 13 设置无 xml 持久性 JPA Hibernate 4 Spring 3 当我尝试在 jpa 控制台中执行查询时 出现以下错误 javax persistence PersistenceException
  • 如何查找是否存在从顶点 x 到顶点 y 且包含边 e 的简单路径

    所以我面临这个问题 我希望有人可以帮助我 给定一个无向的图 G V E 2 个顶点 x y 和一条边 e v u 建议一种算法来查找是否存在简单的路径从 x 到 y 包括边 e 所以这里的重点是简单路径而不是常规路径 对于常规路径来说 使用
  • 在word中设置单个字母的样式

    我目前正在尝试设计 Siteripe 一词的样式 我希望每个字母都有不同的颜色 如本图所示page http www mobile siteripe com我可以使用下面的 CSS 代码行仅设置第一个字母的样式 namer first le
  • 防止 SQL Server 中的缓存

    使用Uncle Google浏览网络后 我找不到这个问题的答案 监视运行 IIS 和 MS SQL Server 2005 的生产服务器的性能和响应能力的最佳方法是什么 我目前正在使用 Pingdom 并希望它指向一个基本上模仿 现实世界查
  • Android Picasso 自动旋转图像

    我正在使用 Picasso 在我的应用程序中加载来自网络的图像 我注意到有些图像显示旋转了 90 度 尽管当我在浏览器中打开图像时 我看到它的位置正确 我假设这些图像有 EXIF 数据 有什么方法可以让Picasso忽略EXIF吗 众所周知
  • 自动从实体类@Size值复制inputText maxlength

    是否可以设置maxlength的属性
  • Web Api oData v4 $ref 404 或服务器错误

    Problem 我可以使用以下命令成功地从该关系的任一端获取相关项目 http localhost api 练习 1 http localhost api Exercises 1 expand 测量值 http localhost 4954
  • Git 命令自动子树合并项目与子模块?

    I found 使用 Git 子树合并具有子模块的外部项目的最佳方法是什么 https stackoverflow com questions 645019 using git whats the best way to subtree m