使用 GTWS 管理复杂的 Git 工做空间

GTWS 是一系列脚本,它使咱们在开发环境中管理不一样的项目和项目的各个版本变得很容易。html

Great Teeming Workspaces(GTWS)是一个 Git 的复杂工做空间管理工具包,它使咱们在开发环境中管理不一样的项目和项目的各个版本变得很容易。python

有点像 Python 的 venv,但不是为 Python 语言准备的。GTWS 用来管理多个项目的多个版本的工做空间。你能够很容易地建立、更新、进入和离开工做空间,每一个项目或版本的组合(最多)有一个本地的 origin,用来与 upstream 同步 — 其他的全部工做空间都从本地的 origin 更新。linux

部署

${GTWS_ORIGIN}/<project>/<repo>[/<version>]
${GTWS_BASE_SRCDIR}/<project>/<version>/<workspacename>/{<repo>[,<repo>...]}

源代码目录的每一级(包括全局的家目录)能够包含一个 .gtwsrc 文件,这个文件中维护与当前级相关的设置和 bash 代码。每一级的配置会覆盖上一级。git

安装

用下面的命令检出 GTWS:github

git clone https://github.com/dang/gtws.git

配置你的 ${HOME}/.gtwsrc。它应该包含 GTWS_ORIGIN,也能够再包含 GTWS_SETPROMPTshell

把仓库目录加到环境变量中:bash

export PATH="${PATH}:/path/to/gtws

配置

经过级联 .gtwsrc 文件来进行配置。它从根目录向下遍历,会执行在每级目录中找到的 .gtwsrc 文件。下级目录的文件会覆盖上一级。函数

在你最上层的文件 ~/.gtws/.gtwsrc 中进行以下设置:工具

  • GTWS_BASE_SRCDIR:全部项目源文件目录树的基目录。默认为 $HOME/src
  • GTWS_ORIGIN: 指定 origin git 目录树的路径。默认为 $HOME/origin
  • GTWS_SETPROMPT: 可选配置。若是配置了这个参数,shell 提示符会有工做空间的名字。
  • GTWS_DEFAULT_PROJECT: 不指定项目或项目未知时默认的项目名。若是不指定,使用命令行时必须指明项目。
  • GTWS_DEFAULT_PROJECT_VERSION: 检出的默认版本。默认为 master

在每一个项目的根目录进行如下设置:测试

  • GTWS_PROJECT: 项目的名字(和基目录)。
  • gtws_project_clone: 这个函数用于克隆一个项目的指定版本。若是未定义,它会假定项目的 origin 对每个版本都有一个单独的目录,这样会致使克隆一堆 Git 仓库。
  • gtws_project_setup: 在克隆完全部的仓库后,能够选择是否调用这个函数,调用后能够对项目进行必要的配置,如在 IDE 中配置工做空间。

在项目版本级进行如下设置:

  • GTWS_PROJECT_VERSION: 项目的版本。用于正确地从 origin 拉取代码。相似 Git 中的分支名字。

下面这些参数能够在目录树的任意地方进行配置,若是能生效,它们能够被重写屡次:

  • GTWS_PATH_EXTRA: 这些是工做空间中加到路径后的额外的路径元素。
  • GTWS_FILES_EXTRA: 这些是不在版本控制内,但应该在工做空间中被检出的额外的文件。这些文件包括 .git/info/exclude,每一个文件都与仓库的基目录相关联。

origin 目录

GTWS_ORIGIN (大部分脚本中)指向拉取和推送的原始 Git 检出目录。

${GTWS_ORIGIN} 部署:

  • /<project>
    • 这是一个项目的仓库的基目录。
    • 若是指定了 gtws_project_clone,你能够配置任意的部署路径。
    • 若是没有指定 gtws_project_clone,这个路径下必须有个名为 git 的子目录,且 git 目录下有一系列用来克隆的裸 Git 仓库。

工做流示例

假设你有一个项目名为 Foo,它的 upstream 为 github.com/foo/foo.git。这个仓库有个名为 bar 的子模块,它的 upstream 是 github.com/bar/bar.git。Foo 项目在 master 分支开发,使用稳定版本的分支。

为了能在 Foo 中使用 GTWS,你首先要配置目录结构。本例中假设你使用默认的目录结构。

  • 配置你最上层的 .gtwsrc
    • cp ${GTWS_LOC}/examples/gtwsrc.top ~/.gtwsrc
    • 根据须要修改 ~/.gtwsrc
  • 建立顶级目录:
    • mkdir -p ~/origin ~/src
  • 建立并配置项目目录:

    • mkdir -p ~/src/foo

      cp ${GTWS_LOC}/examples/gtwsrc.project ~/src/foo/.gtwsrc

    • 根据须要修改 ~/src/foo/.gtwsrc

  • 建立并配置 master 版本目录:

    • mkdir -p ~/src/foo/master

      cp ${GTWS_LOC}/examples/gtwsrc.version ~/src/foo/master/.gtwsrc

    • 根据须要修改 ~/src/foo/master/.gtwsrc

  • 进入版本目录并建立一个临时工做空间来配置镜像:

    • mkdir -p ~/src/foo/master/tmp

      cd ~/src/foo/master/tmp

      git clone --recurse-submodules git://github.com/foo/foo.git

      cd foo

      gtws-mirror -o ~/origin -p foo(译注:这个地方原文有误,不加 -s 参数会报错)

    • 上面命令会建立 ~/origin/foo/git/foo.git~/origin/foo/submodule/bar.git

    • 之后的克隆操做会从这些 origin 而不是 upstream 克隆。

    • 如今能够删除工做空间了。

到如今为止,Foo 的 master 分支的工做能够结束了。假设你如今想修复一个 bug,名为 bug1234。你能够脱离你当前的工做空间为修复这个 bug 单首创建一个工做空间,以后在新建立的工做空间中开发。

  • 进入版本目录,建立一个新的工做空间:

    • cd ~/src/foo/master

      mkws bug1234

    • 上面的命令建立了 bug1234/,在这个目录下检出了 Foo(和它的子模块 bar),并建立了 build/foo 来构建它。

  • 有两种方式进入工做空间:

    • cd ~/src/foo/master/bug1234

      startws

      或者

      cd ~/src/foo/master/

      startws bug1234

    • 上面的命令在 bug1234 工做空间中开启了一个子 shell。这个 shell 有 GTWS 的环境和你在各级 .gtwsrc 文件中设置的环境。它也把你工做空间的基目录加入到了 CD,所以你能够从 base 路径 cd 到相关的目录中。

    • 如今你能够修复 bug1234 了,构建、测试、提交你的修改。当你能够把代码推送到 upstream 时,执行下面的命令:

      cd foo

      wspush 

    • wspush 会把代码推送到与你工做空间相关的分支 — 先推送到本地的 origin,再推送到 upstream。

    • 当 upstream 有修改时,你能够用下面的命令同步到本地:

      git sync

    • 上面的命令调用了 GTWS 的 git-sync 脚本,会从本地 origin 更新代码。使用下面的命令来更新本地的 origin:

      git sync -o 

    • 上面的命令会更新你本地的 origin 和子模块的镜像,而后用那些命令来更新你的检出仓库的代码。git-sync 也有一些其余的很好的工鞥。

    • 当要结束工做空间中的工做时,直接退出 shell:

      exit

    • 你能够在任什么时候间重复进入工做空间,也能够在同一时间在相同的工做空间中开多个 shell。

  • 当你不须要某个工做空间时,你可使用 rmws 来删除它,或者直接删除它的目录树。

  • 还有一个脚本 tmws 使用 tmux 进入工做空间,能建立一系列的窗口/窗格,这完美契合个人工做流。你能够根据你本身的需求来修改它。


via: https://opensource.com/article/20/2/git-great-teeming-workspaces

做者:Daniel Gryniewicz 选题:lujun9972 译者:lxbwolf 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索