SourceTree - Custom Actioins

SourceTree 提供 Custom Actions 的功能
讓 User 可以自訂語法或寫 Shell Script 來執行
目前自己寫了三個 Shell Script

備份 .git

Script

目的是將 project 底下的 .git 備份出去

有時會想要測試一些 git 指令,卻又怕把 repo 搞亂、搞壞
所以可以先把 .git 備份起來

語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用

檔案路徑:~/SourceTree_Actions/backupGitFolder.sh

$1 → 在 SourceTree 使用時,設定讓它帶入 repo path,為了區別不同 product 下的 .git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
# 設定備份路徑
backupPath=~/Downloads/backupGit/
# 取得目錄名稱
folderName=`basename $1`
# 將目錄剛整路徑 MD5
folderNameSHA=`md5 <<< "$1"`
# 組合備份目錄名稱
backupFolderName="${folderName}__${folderNameSHA}__git"
# 刪除原備份目錄
rm -rf ${backupPath}${backupFolderName}
# 將 .git copy 出去
cp -rf ./.git ${backupPath}${backupFolderName}

使用方式

1
建議再第一次使用時,先手動將 .git 備份出去,避免設定上出問題導至 .git 完全不見且沒備份到

開啟設定介面 SourceTree → Preferences 或 快速鍵 CMD + ,

切換至 Custom Actions
新增 Add

Menu Caption → backupGitFolder (自訂)
Script to run → bash (使用 bash 來執行 script)
Parameters → /SourceTree_Actions/backupGitFolder.sh $REPO script 路徑,且帶入參數 $REPO

新增完後會看到剛新增的項目

因為此 Script 是針對 Repo 來做處理,所以只要在任一個 Commit 上按右鍵即可
右鍵 → Custom Actions → Repository Actions → backupGitFolder

執行完畢後,會出現在 Script 所設定的備份路徑

還原 .git

Script

目的是將先前備份的 .git 還原回 product 裡

測試一些指令後想把先前備份的 .git 還原回來

語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用

檔案路徑:~/SourceTree_Actions/restoreGitFolder.sh

$1 → 在 SourceTree 使用時,設定讓它帶入 repo path,為了區別不同 product 下的 .git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
# 設定備份路徑
backupPath=~/Downloads/backupGit/
# 取得目錄名稱
folderName=`basename $1`
# 將目錄剛整路徑 MD5
folderNameSHA=`md5 <<< "$1"`
# 組合備份目錄名稱
backupFolderName="${folderName}__${folderNameSHA}__git"
rm -rf ./.git
cp -rf ${backupPath}${backupFolderName} ./.git

使用方式

1
建議再第一次使用時,先手動將 .git 備份出去,避免設定上出問題導至 .git 完全不見且沒備份到

開啟設定介面 SourceTree → Preferences 或 快速鍵 CMD + ,

切換至 Custom Actions
新增 Add

Menu Caption → restoreGitFolder (自訂)
Script to run → bash (使用 bash 來執行 script)
Parameters → /SourceTree_Actions/restoreGitFolder.sh $REPO script 路徑,且帶入參數 $REPO

新增完後會看到剛新增的項目

1
2
3
4
5
由於 SourceTree 會持續針測 Repo 的變化
如果一樣在 Commit 上右鍵使用的話,線圖會一直報錯
所以我會關閉這個 Repo 介面,直接在 Repo List 上使用
如果電腦不快 或 Repo 較大,導至做還原動作時間超過 SourceTree 針測時間還是會報錯
不過可以不理它....

因為此 Script 是針對 Repo 來做處理,所以要在指定的 Repo 上按右鍵
右鍵 → Custom Actions → Repository Actions → restoreGitFolder

這個是報錯的畫面,意思是找不到 git log

差異打包

Script

目日是將 HEAD 與某個 commit 做差異打包

有時在功能完成後要放到其它環境下時,該環境可能不沒有 GIT,這時會需要做差異打包上傳

檔案路徑:~/SourceTree_Actions/archiveCustomCommit.sh

$1 → 在 SourceTree 使用時,設定讓它帶入自行選擇的 Commit SHA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/sh
# 取得現在日期時間
dateStr=`date +%Y%m%d%H%M%S`
# 設定打包檔案放置路徑
archivePath=~/Downloads/
# 取得目錄名稱
folderName=`basename $1`
# 查詢當下的 tags name 或 commit sha
currentSHA=`git rev-parse --short HEAD`
currentTag=`git show-ref --tags -d | grep ^${currentSHA} | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'`
if [ "${currentTag}" = "" ] || [ "${currentTag}" = "HEAD" ]; then
currentTag=`git rev-parse --short "${currentSHA}"`
fi
# 查詢選擇的 tags name 或 commit sha
diffTag=`git show-ref --tags -d | grep ^"$2" | sed -e 's,.* refs/tags/,,' -e 's/\^{}//'`
if [ "${diffTag}" = "" ] || [ "${diffTag}" = "HEAD" ]; then
diffTag=`git rev-parse --short "$2"`
fi
# 組合打包檔名
archiveFileName="${folderName}__${dateStr}__${currentTag}_Diff_${diffTag}.zip"
# 進行打包
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${diffTag} ${currentSHA} | xargs zip ${archivePath}${archiveFileName}

使用方式

1
建議再第一次使用時,先手動將 .git 備份出去,避免設定上出問題導至 .git 完全不見且沒備份到

開啟設定介面 SourceTree → Preferences 或 快速鍵 CMD + ,

切換至 Custom Actions
新增 Add

Menu Caption → restoreGitFolder (自訂)
Script to run → bash (使用 bash 來執行 script)
Parameters → /SourceTree_Actions/archiveCustomCommit.sh $REPO $SHA Script 路徑,且帶入參數 \$REPO、\$SHA

新增完後會看到剛新增的項目

因為此 Script 是針對 HEAD 與指定 Commit 來做處理,所以要在指定的 Commit 上按右鍵
右鍵 → Custom Actions → archiveCustomDiffCommit

此範例是要將 ad1e0aa 與 b5fefac 兩個 Commit 的差異做打包
執行完後,會在指定的目錄下看到差異打包檔

如果 Commit 上是有 Tag 的話

此範例是要將 ad1e0aa 與 b5fefac(TestTag) 兩個 Commit 的差異做打包
執行完後,會在指定的目錄下看到差異打包檔,並且使用 Tag 來當檔名