Pertanyaan Bagaimana saya bisa mendapatkan daftar cabang git, diperintahkan oleh komitmen terbaru?


Saya ingin mendapatkan daftar semua cabang dalam repositori Git dengan cabang-cabang "segar" di bagian atas, di mana cabang "segar" adalah cabang yang paling baru (dan karena itu, lebih mungkin menjadi satu Saya ingin memperhatikan).

Apakah ada cara saya dapat menggunakan Git untuk (a) mengurutkan daftar cabang dengan komit terbaru, atau (b) mendapatkan daftar cabang bersama dengan tanggal commit terakhir masing-masing, dalam beberapa jenis format yang dapat dibaca oleh mesin?

Kasus terburuk, saya selalu bisa berlari git branch untuk mendapatkan daftar semua cabang, menguraikan outputnya, dan kemudian git log -n 1 branchname --format=format:%ci untuk masing-masing, untuk mendapatkan tanggal komitmen setiap cabang. Tetapi ini akan berjalan di kotak Windows, di mana proses baru yang berputar relatif mahal, sehingga meluncurkan git yang dapat dieksekusi sekali per cabang bisa lambat jika ada banyak cabang. Apakah ada cara untuk melakukan semua ini dengan satu perintah?


891
2018-03-04 00:26


asal


Jawaban:


Menggunakan --sort=-committerdate opsi dari git for-each-ref;
  Juga tersedia sejak Git 2.7.0 untuk git branch:

Penggunaan Dasar:

git for-each-ref --sort=-committerdate refs/heads/

# or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

Hasil:

result

Penggunaan Tingkat Lanjut:

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

Hasil:

result


1220
2018-03-04 00:33



Daftar nama-nama cabang git, diperintahkan oleh commit terbaru ...

Memperluas jawaban Jakub dan tip Joe, berikut ini akan menghapus "ref / heads /" sehingga output hanya menampilkan nama cabang:


Perintah:

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

Hasil:

recent git branches


110
2018-05-12 01:21



Inilah kode optimal, yang menggabungkan dua jawaban lainnya:

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

74
2018-05-21 23:22



Berikut ini adalah perintah sederhana yang mencantumkan semua cabang dengan commit terbaru:

git branch -v

Untuk memesan dengan komit terbaru, gunakan

git branch -v --sort=committerdate

Sumber: http://git-scm.com/book/en/Git-Branching-Branch-Management


64
2018-03-13 11:54



Saya menggunakan alias berikut:

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

yang menghasilkan: result

Edit: gunakan '|' untuk memisahkan, terima kasih kepada @ Björn Lindqvist

Pembaruan: ditambahkan * sebelum cabang saat ini, terima kasih @elhadi
Edit: perbaiki kasus di mana cabang saat ini adalah substring dari cabang lain

Edit: gunakan sintaks yang lebih sederhana untuk cabang saat ini, terima kasih @Joshua Skrzypek


36
2018-05-06 12:05



Saya juga membutuhkan warna, tag, dan referensi jauh tanpa duplikat:

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

Karena mengutip bisa jadi sulit, di sini alias untuk bash:

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"

34
2017-08-19 09:27



Jawaban lainnya sepertinya tidak memungkinkan lewat -vv untuk mendapatkan output verbose.

Jadi inilah satu-garis yang menyortir git branch -vv dengan tanggal commit, menjaga warna dll:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

Jika Anda juga ingin mencetak tanggal commit, Anda dapat menggunakan versi ini sebagai gantinya:

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

Output sampel:

2013-09-15   master                  da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

Ini mungkin dibagi lebih mudah dibagi menjadi beberapa baris:

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

Ini juga harus bekerja dengan argumen lain git branch, mis. -vvr untuk mencantumkan cabang pelacakan jarak jauh, atau -vva untuk mencantumkan cabang pelacak jarak jauh dan lokal.


22
2017-09-12 15:06