2012-06-21 16 views
22

我有時使用包含許多分支的源代碼存儲庫,其中大多數分支都是舊的並且通常不再相關。如何在git中只列出活動/最近更改的分支?

在這些情況下,從git branch分支的完整列表不是很有幫助。有沒有辦法只列出「活躍」分支?例如,只有在最近的n天收到提交的分支?理想情況下,該列表將包括每個分支的最後提交日期,並指出該分支是否已經完全合併。我知道這也可以通過刪除「舊」分支來解決(例如在What to do with experimental non-merged git branches?中討論的),但是這對於給定的項目可能並不總是實際或被接受。

+0

可能的重複[如何獲得git分支列表,由最近的提交排序?](http://stackoverflow.com/questions/5188320/how-can-i-get-a-list-of -git-branches-ordered-most-recent-commit) – sleske

+0

剛剛意識到這是重複的。 – sleske

回答

27

您可以使用git-for-each-ref讓所有本地和跟蹤分行在由最後的提交者提交日期這樣降序排列的列表:

git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes 

這種輸出例如:

2012-06-23 refs/heads/master 
2012-06-21 refs/remotes/origin/HEAD 
2012-06-21 refs/remotes/origin/master 

您可以添加--count=m以獲取最多m分支,您可以使用--sort=-authordate而不是使用提交者日期,您當然可以使用不同的格式。 for-each-ref本身不會按日期限制結果,但必須單獨編寫腳本,但至少您有手頭提交對象的日期。

+1

酷,*完全*我在找什麼。有點諷刺的是,這實際上已經是git的一部分。也許我應該閱讀文檔... – sleske

+0

是的,我也是:/ – jkrcma

+4

不要忘記首先運行'git remote prune origin',否則你可能會得到一箇舊列表,包括遠程站點上不存在的東西 –

7
ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done; 

此oneliner打印按時間排序的所有本地分行從最新到最舊。每個分支都有最後一次提交可讀的日期字符串。您可以將其添加到您的.gitconfig

對於遠程分支我想出了這個令人毛骨悚然的解決方案:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $(echo $b | cut -d' ' -f1) --; done | sort -rn -k1,10 | cut -c11- 

編輯:我越覺得,更多的恐怕這可能是不可靠的,因爲ls-remote始終連接到遠程端,而log不。在每次運行此命令之前,可能需要執行fetch

+0

好戲。不幸的是,這隻適用於本地分支,不適用於遠程分支(在'/ refs/remote'下)。它也不適用於本地跟蹤分支,因爲ref文件的mtime通常反映最後一次獲取,而不是最後一次(上游)提交。 – sleske

+0

@sleske我可以做殼魔術,看到更新的答案:) – jkrcma