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_SETPROMPT
。shell
把倉庫目錄加到環境變量中: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