git 查找超過 X 天的分支



前言

  • 我的一個用來處理 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

  1. sed /\*/d:是為了把「標示當前 branch」的星號移除;
    如果沒有移除,一般 git branch output 會長這樣

    1
    2
    3
    
    * dev
    stage
    master
    
  2. -s:不顯示 diff 相關資訊

  3. 沒有用 --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 時間點重疊。

所以當 --since1 weeks ago2 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

  1. https://stackoverflow.com/questions/10325599/delete-all-branches-that-are-more-than-x-days-weeks-old
Licensed under CC BY-NC-SA 4.0
最後更新 2024-09-30 02:27

主題 StackJimmy 設計