首页 > 其他分享 >git subtree的使用简介

git subtree的使用简介

时间:2023-06-11 10:44:05浏览次数:53  
标签:git 仓库 简介 subtree -- 子项目 subproject

1、git subtree的使用简介

git subtree是一个Git命令,用于在单个Git仓库中管理多个项目。它允许您将一个项目的子目录作为独立的Git仓库处理,同时仍然保持在主仓库中。这使得在不使用子模块的情况下,更容易地将多个项目组合在一个仓库中。

以下是git subtree的一些常见用法:

  1. 添加子树:

要将一个远程仓库作为子树添加到当前仓库中,可以使用以下命令:

git subtree add --prefix=<subtree-directory> <remote-url> <branch> --squash

其中,<subtree-directory>是子树在当前仓库中的目录,<remote-url>是远程仓库的URL,<branch>是要添加的远程分支, --squash选项用于将子树的历史压缩成一个提交。

  1. 拉取子树的更新:

要从远程仓库拉取子树的更新,可以使用以下命令:

git subtree pull --prefix=<subtree-directory> <remote-url> <branch> --squash这将从远程仓库的指定分支拉取更新,并将它们合并到子树目录中。

  1. 推送子树的更改:

要将子树的更改推送回远程仓库,可以使用以下命令:

git subtree push --prefix=<subtree-directory> <remote-url> <branch> --squash这将把子树目录中的更改推送到远程仓库的指定分支。

  1. 分割子树:

如果您想将子树分割为一个独立的仓库,可以使用以下命令:

git subtree split --prefix=<subtree-directory> --branch=<new-branch>这将创建一个新的分支,其中只包含子树目录的历史记录。

请注意,git subtree命令可能需要在某些Git版本中手动安装。要获取关于git subtree的更多信息和用法,请查阅官方文档:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt

2、git subtree split的典型使用场景

git subtree splitgit subtree命令的一个子命令,用于将一个子树(子目录)从当前仓库中分离出来,创建一个新的分支,其中只包含子树的历史记录。这在将子树转移到一个独立的仓库或将其与其他仓库合并时非常有用。

以下是git subtree split的详细用法:

subtree split --prefix=<subtree-directory> --branch=<new-branch> [--annotate=<annotation>] [--rejoin] [--onto=<commit>]

  • <subtree-directory>:要分离的子树目录。
  • <new-branch>:新创建的分支名称,其中包含子树的历史记录。
  • --annotate=<annotation>(可选):为分离的提交添加注释。这有助于在将来识别子树的来源。
  • --rejoin(可选):在分离子树后,将其重新连接到主仓库。这样,您可以继续在主仓库中跟踪子树的更改。
  • --onto=<commit>(可选):将子树的历史记录重新定位到指定的提交。这在将子树合并到另一个仓库时非常有用。

典型的使用场景:

  1. 将子树转移到独立仓库:

    如果您有一个包含多个项目的仓库,但现在希望将其中一个项目转移到一个独立的仓库,可以使用git subtree split命令。首先,使用git subtree split创建一个新分支,其中只包含子树的历史记录。然后,将新分支推送到新仓库。

  2. 将子树与其他仓库合并:

    如果您有两个仓库,希望将其中一个仓库的子目录合并到另一个仓库中,可以使用git subtree split命令。首先,在源仓库中使用git subtree split创建一个新分支,其中只包含子树的历史记录。然后,在目标仓库中使用

    git fetch获取新分支,并使用git merge将其合并到目标仓库。

  3. 从独立仓库中提取子项目:

    如果您有一个独立的仓库,其中包含多个子项目,您可以使用git subtree split将这些子项目分离出来,以便在其他仓库中使用。这样,您可以更轻松地在多个仓库之间共享和重用代码。

    假设我们有一个名为``main-repo的Git仓库,其中包含一个名为subproject的子目录。我们希望将subproject`

    分离出来,并将其转移到一个名为subproject-repo的新仓库。以下是如何使用git subtree split完成此操作的示例:

    • 首先,在main-repo中使用git subtree split创建一个新分支,其中只包含subproject的历史记录:
    cd main-repo
    git subtree split --prefix=subproject --branch=subproject-branch
    

    这将创建一个名为subproject-branch的新分支,其中包含subproject目录的历史记录。

    • 将新分支推送到新仓库:

    首先,创建一个名为subproject-repo的新仓库。然后,在main-repo中将subproject-branch

    推送到新仓库:

    git push <subproject-repo-url> subproject-branch:main

    其中,<subproject-repo-url>是新仓库的URL。这将把subproject-branch推送到新仓库的main分支。

    • 现在,subproject-repo已经包含了subproject的历史记录。您可以将其克隆到本地,并开始在新仓库中独立地开发和维护subproject
    git clone <subproject-repo-url>
    cd subproject-repo
    

    这个示例展示了如何使用git subtree split将一个子目录从现有仓库中分离出来,并将其转移到一个新的独立仓库。

    3、分离后协同主项目开发

    ·git subtree split·将子目录分离到新仓库后,您仍然可以在主项目中继续开发子项目。为了在主项目和新仓库之间保持同步,您可以使用git subtree pullgit subtree push命令。

    以下是如何在主项目和新仓库之间保持同步的示例:

    1. 在主项目中开发子项目:

      在主项目的subproject目录中进行开发和提交更改。

    2. 将更改推送到新仓库:

      当您准备将更改推送到新仓库时,使用git subtree push命令:

    git subtree push --prefix=subproject <subproject-repo-url> main

    这将把subproject目录中的更改推送到新仓库的main分支。

    • 从新仓库拉取更新:

    如果在新仓库中进行了开发,您可以使用git subtree pull命令将更新拉取到主项目中:

    git subtree pull --prefix=subproject <subproject-repo-url> main

    这将从新仓库的main分支拉取更新,并将它们合并到主项目的subproject目录中。

    通过这种方式,您可以在主项目和新仓库之间保持子项目的同步,从而实现协同开发。请注意,为了避免冲突和合并问题,建议在主项目和新仓库之间保持良好的沟通,并确保团队成员了解他们应该在哪个仓库中进行开发。

    • 要避免在主项目中修改subtree子项目后提交中携带了主项目的修改日志:

      可以使用git add命令仅将子项目的更改添加到暂存区,然后进行提交。这样,提交将仅包含子项目的更改,而不会包含主项目的其他更改。

      以下是如何仅提交子项目更改的示例:

      1. 在主项目中修改子项目(例如subproject)。使用git add命令仅将子项目的更改添加到暂存区:

      git add subproject/这将仅将subproject目录中的更改添加到暂存区,而不会添加主项目的其他更改。

      1. 提交子项目的更改:

        git commit -m "Update subproject"这将创建一个新的提交,其中仅包含子项目的更改。通过这种方式,您可以确保提交中仅包含子项目的更改,而不会携带主项目的修改日志。当然,在推送子项目的更改到新仓库时,仍然需要使用git subtree push命令。

标签:git,仓库,简介,subtree,--,子项目,subproject
From: https://www.cnblogs.com/linxmouse/p/17472610.html

相关文章

  • 一款能“干掉” ChatGPT 的应用「GitHub 热点速览」
    据说有了它,ChatGPT就可以靠边站了。因为Auto-GPT能更加主动地完成你给他的指定任务,不用做更多的人为干涉,它的推理能力比ChatGPT更强,有人用它解放双手做了个React网站。当然除了升级的Auto-GPT之外,还有DeepSpeed,它能极大地降低训练成本。这两个项目可是本周的明星项目,一个......
  • Git实战之git工具的安装
    (Git实战之git工具的安装)一、Git介绍git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。二、Linux环境的检查1.检查Linux系统版本[root@node~]#cat/etc/os-releaseNAME="CentOSLinux"VERSION="7(Core)"ID="centos"ID_LIKE="r......
  • 使用GithubAction自动构建部署项目
    目录1.1项目准备2.1GithubAction设置3.1运行测试4.1小结GitHubActions是一种持续集成和持续交付(CI/CD)平台,可用于自动执行生成、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。GitHubActions不仅仅是DevOps,还......
  • pip 命令简介
    pip简介pip是Python中的标准管理器,它允许安装和管理不属于Python标准库的其它软件包(第三方库);pip简单操作windowsWin+r输入cmd回车pip常用命令查看pip路径C:\Users\admin>wherepipD:\tool\python3.8\Scripts\pip.exe查看pip版本C:\Users\admin>pip-Vp......
  • 熟练使用git之git撤回操作
    需要关注持续更新的朋友可以关注下面的链接:git操作合集地址1、执行了merge但没有commitgitmerge--abort2、撤回上次或者上上次提交代码要撤销上一次提交或上上次提交的代码,有两种常用的方法可以实现:2.1.使用gitrevert撤销提交:撤销上一次提交:gitrevertHEAD撤销上上次提交:g......
  • Golang 定时任务 github/robfig/cron/v3
    robfig/cron/v3 是一个Golang的定时任务库,支持cron表达式。低耦合高内聚,其中涉及装饰器模式,并发处理等。packagemainimport"github.com/robfig/cron/v3"c:=cron.New()//添加一个任务,每30分钟执行一次c.AddFunc("30****",func(){fmt.Println("Everyho......
  • GitlabCI学习笔记之五:GitLabRunner pipeline语法之artifacts dependencies
    artifacts用于指定在作业成功或者失败时应附加到作业的文件或目录的列表。作业完成后,工件将被发送到GitLab,并可在GitLabUI中下载。artifacts:paths路径是相对于项目目录的,不能直接链接到项目目录之外。将制品设置为target目录artifacts:paths:-target/禁用工件......
  • GitlabCI学习笔记之五:GitLabRunner pipeline语法之cache
    cache缓存用来指定需要在job之间缓存的文件或目录。只能使用该项目工作空间内的路径。不要使用缓存在阶段之间传递工件,因为缓存旨在存储编译项目所需的运行时依赖项。如果在job范围之外定义了cache ,则意味着它是全局设置,所有job都将使用该定义。如果未全局定义或未按job定义则......
  • rpc简介
    10分钟带你学会分布式网络技术RPCRPC,RemoteProcedureCall,中文称作远程过程调用”,通过网络从远程计算机上请求服务。RPC是一种技术思想,是一种普适性的方法,而非一种规范和协议。所以广义上来说,http协议也属于rpc。狭义上,我认为rpc就是让本地调用远程方法变得简单。grpc就是基于h......
  • 加速tortoisegit的show log,减少等待时间
    减少showlog等待时间90%的情况下下我们对gitrepo执行showlog都只需要查看最近的提交记录,所以减少log条数,就可以加速打开时间。settings->dialogs1->logmessages->dafaultlimitationoflogmessages,建议选择:lastNlimits(限制查看log的条数)40~50G的大仓库show......