前言
- 我的一個用來處理 CD (Continuous Delivery) 的 git repo,
近期已經累積的太多的 branch,
於是做了 bash function 列出「超過 X 週沒有新 commit 」的 branches,
方便後續決定要不要刪除。
說明
列出距離「上一次 Commit 」已超過 X 週的 branch
local branch:
1
2
3
4
|
for branch in $(git branch | sed /\*/d); do
result=$(git log -1 --since='8 week ago' -s ${branch})
[[ -z "${result}" ]] && echo "${branch}"
done
|
remote branch:
1
2
3
4
|
for k in $(git branch -r | sed /\*/d | grep -v '/HEAD'); do
result=$(git log -1 --since='8 week ago' -s $k)
[[ -z "${result}" ]] && echo "$k"
done
|
Note
-
sed /\*/d
:是為了把「標示當前 branch」的星號移除;
如果沒有移除,一般 git branch
output 會長這樣
-
-s
:不顯示 diff 相關資訊
-
沒有用 --before
是因為 branch 的歷史跟 default branch 都一樣,沒有鑑別度。
用 git log --since=
:去查詢「上一次 Commit 」已超過 X 週的 commit log;
如果找不到,就代表這個時間區間已經比超過 branch 上一次 commit 還要短。
概念像是這樣:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
(時間)
----------------------------------------------+ (now)
(Commit 時間點)
*--*----**------*--*---------*
(--since 的區間)
1 weeks ago
+------+
2 weeks ago
+------+------+
3 weeks ago
+------+------+------+
(抓 3 週才跟最後一次 commit 時間重疊!)
|
如上面示意圖,抓到 --since
要抓到 3 週才會跟最後一次 commit 時間點重疊。
所以當 --since
給 1 weeks ago
或 2 weeks ago
時,回傳的結果會是空白;
因此我們要的就是抓出給定時間區間卻「回傳空白」(-z
) 的那些 branch,
代表他已經停止活動了。
包成 function
只查找 local branch:
1
2
3
4
5
6
7
|
list_no_active_branches_over_weeks() {
weeks_threshold=$1
for branch in $(git branch | sed /\*/d); do
result="$(git log -1 --since="${weeks_threshold}' week ago'" -s "${branch}")"
[[ -z "${result}" ]] && echo "${branch}"
done
}
|
查找 remote branch:
1
2
3
4
5
6
7
|
list_remote_no_active_branches_over_weeks() {
weeks_threshold=$1
for branch in $(git branch -r | sed /\*/d | grep -v '/HEAD'); do
result="$(git log -1 --since="${weeks_threshold}' week ago'" -s "${branch}")"
[[ -z "${result}" ]] && echo "${branch}"
done
}
|
Example usage:
1
2
|
list_no_active_branches_over_weeks 8
list_remote_no_active_branches_over_weeks 8
|
如果要批次刪除,就再把結果 pipe 給 xargs
就好。
1
2
|
list_no_active_branches_over_weeks 8 | xargs echo
# (安全起見先註解掉) 這邊改成 | xargs git branch -d
|
REF
- https://stackoverflow.com/questions/10325599/delete-all-branches-that-are-more-than-x-days-weeks-old