Saya ingin mendapatkan daftar semua cabang-cabang di sebuah repositori Git dengan "segar" cabang-cabang di bagian atas, di mana "segar" cabang adalah salah satu yang's telah berkomitmen untuk paling baru-baru ini (dan, karena itu, lebih mungkin untuk menjadi salah satu yang saya inginkan untuk memperhatikan).
Apakah ada cara saya dapat menggunakan Git untuk (a) menyusun daftar cabang-cabang terbaru komit, atau (b) mendapatkan daftar cabang bersama-sama dengan masing-masing satu's-melakukan upload, dalam beberapa jenis format yang bisa dibaca mesin?
Kasus terburuk, aku selalu bisa menjalankan git branchuntuk mendapatkan daftar dari semua cabang, mengurai output, dan kemudian
git log -n 1 branchname --format=format:%ci` untuk masing-masing, untuk mendapatkan masing-masing cabang's melakukan upload. Tapi ini akan berjalan pada Windows kotak, di mana berputar sampai baru proses ini relatif mahal, sehingga meluncurkan Git dieksekusi sekali setiap cabang bisa lambat jika ada banyak cabang. Apakah ada cara untuk melakukan semua ini dengan satu perintah?
Gunakan --sort=-committerdate
pilihan dari git untuk-setiap-ref
;
Juga tersedia sejak Git 2.7.0 gitcabang
:
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
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))'
Memperluas Jakub jawaban dan Joe tip, berikut akan strip out "ref/kepala/" sehingga output hanya menampilkan nama cabang:
git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'
Berikut ini adalah perintah sederhana yang berisi daftar semua cabang dengan melakukan:
git branch -v
Untuk urutan berdasarkan yang paling baru-baru ini melakukan, menggunakan
git branch -v --sort=committerdate
Sumber: http://git-scm.com/book/en/Git-Branching-Branch-Management
Saya gunakan berikut ini alias:
baru-baru = "!r(){git untuk-setiap-ref --sort=-committerdate ref/kepala --format='%(KEPALA)%(warna:kuning)%(refname:pendek)|%(warna:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|kolom -ts'|'}; r"
yang menghasilkan:
Gunakan '|' untuk memisahkan.
Saya juga dibutuhkan warna, kategori dan remote referensi 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 sulit, berikut adalah 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'"]++'"
Saya dapat referensi contoh sebelumnya untuk menciptakan sesuatu yang terbaik bagi saya.
git untuk-setiap-ref --sort=-committerdate ref/kepala/ --format='%(authordate:pendek) %(warna:merah)%(objectname:pendek) %(warna:kuning)%(refname:pendek)%(warna:reset) (%(warna hijau)%(committerdate:relatif)%(warna:reset))'
Lain jawaban don't tampaknya memungkinkan melewati -ay
untuk mendapatkan output verbose.
Jadi di sini's one-liner yang macam git branch -ay
dengan melakukan upload, memelihara 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 melakukan upload, 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-
Contoh output:
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
It's mungkin lebih mudah dibaca 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 untuk git branch
, misalnya -vvr
untuk daftar jarak jauh-melacak cabang, atau -vva
untuk daftar kedua jarak jauh-melacak dan cabang-cabang lokal.
git 2.7 (Q4 2015) akan memperkenalkan cabang pengurutan menggunakan langsung git branch
:
Lihat melakukan aa3bc55, melakukan aedcb7d, melakukan 1511b22, melakukan f65f139, ... (23 Mar 2015), melakukan aedcb7d, melakukan 1511b22, melakukan ca41799 (24 dec 2015), dan melakukan f65f139, ... (23 Apr 2015) oleh Karthik Nayak (KarthikNayak
).
(Digabung dengan Junio C Hamano -- gitster
-- di melakukan 7f11b48, 15 Apr 2015)
Secara khusus, melakukan aedcb7d:
cabang.c
: penggunaan 'ref-filter
' Api
Membuat 'cabang.c
' menggunakan 'ref-filter
' Api untuk iterasi melalui ref penyortiran. Hal ini menghilangkan sebagian besar kode yang digunakan di 'cabang.c
' menggantinya
dengan panggilan ke 'ref-filter
' perpustakaan.
Itu menambahkan opsi --sort=<kunci>
:
Urutkan berdasarkan kunci yang diberikan. Awalan
-
untuk mengurutkan dalam urutan dari nilai.
Anda dapat menggunakan
--sort=<kunci>
pilihan beberapa kali, dalam hal mana kunci terakhir menjadi kunci utama.
kunci didukung adalah sama seperti orang-orang di
git untuk-setiap-ref
. Urutan default sorting berdasarkan penuh refname (termasukref/...
prefix). Ini daftar KEPALA terpisah (jika ada) terlebih dahulu, kemudian cabang-cabang di daerah dan akhirnya remote-cabang pelacakan.
Berikut:
git branch --sort=-committerdate
Atau (lihat di bawah ini dengan Git 2.19)
# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch
Lihat juga melakukan 9e46833 (30 mar 2015) oleh Karthik Nayak (KarthikNayak
).
Membantu-oleh: Junio C Hamano (gitster
).
(Digabung dengan Junio C Hamano -- gitster
-- di melakukan 415095f, 03 Nov 2015)
Ketika menyortir sesuai dengan nilai-nilai numerik (misalnya
--sort=objectsize
) tidak ada mundur dibandingkan ketika kedua ref memegang nilai yang sama. Hal ini dapat menyebabkan hasil yang tak terduga (yaitu urutan dari daftar referral dengan nilai yang sama tidak dapat ditentukan) seperti yang ditunjukkan oleh Johannes Sixt ($gmane/280117).
oleh Karena itu, mundur ke abjad perbandingan berdasarkan refname setiap kali kriteria lain yang sama.
$ git branch --sort=objectsize
* (HEAD detached from fromtag)
branch-two
branch-one
master
Dengan Git 2.19, urutan dapat diatur secara default.
git branch
mendukung config cabang.semacam
, seperti git tag
, yang sudah punya config tag.semacam
.
Lihat melakukan 560ae1c (16 Agustus 2018) oleh Samuel Maftoul (`).
(Digabung dengan Junio C Hamano -- gitster
-- di melakukan d89db6f, 27 Agustus 2018)
cabang.urutkan:
Ini variabel kontrol semacam pemesanan cabang ketika ditampilkan oleh
git-cabang
. Tanpa "`--sort=." opsi yang disediakan, nilai dari variabel ini akan digunakan sebagai default.
Untuk daftar remote cabang, menggunakan git branch -r --sort=objectsize. The
-r` bendera menyebabkan untuk daftar jarak jauh bukan cabang dari cabang-cabang lokal.
Saya suka menggunakan tanggal relatif dan memperpendek nama cabang seperti ini:
git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads
Yang memberikan anda output:
21 minutes ago nathan/a_recent_branch
6 hours ago master
27 hours ago nathan/some_other_branch
29 hours ago branch_c
6 days ago branch_d
Saya sarankan membuat Bash file untuk menambahkan semua anda favorit alias dan kemudian berbagi script untuk tim anda. Berikut ini's contoh untuk menambahkan hanya satu ini:
#!/bin/sh
git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"
Maka anda hanya dapat melakukan ini untuk mendapatkan diformat dengan baik dan diurutkan cabang lokal daftar:
git branches
Update: Lakukan ini jika anda ingin mewarnai:
#!/bin/sh
#
(echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
Sebagai Git 2.19 anda dapat:
git branch --sort=-committerdate
Anda juga dapat:
git config branch.sort -committerdate
Jadi, setiap kali anda daftar cabang-cabang di saat repositori, maka akan terdaftar diurutkan berdasarkan committerdate.
Jika setiap kali anda daftar cabang-cabang, anda ingin mereka diurutkan berdasarkan comitterdate:
git config --global branch.sort -committerdate
Disclaimer: saya'm penulis dari fitur ini di Git, dan saya menerapkan itu ketika saya melihat pertanyaan ini.
Saya datang dengan perintah berikut (untuk Git 2.13 dan kemudian):
git branch -r --sort=creatordate \
--format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
| grep -v ";HEAD$" \
| column -s ";" -t
Jika anda tidak memiliki kolom
anda dapat mengganti baris terakhir dengan
| sed -e "s/;/\t/g"
Output terlihat seperti
6 years ago Tom Preston-Werner book
4 years, 4 months ago Parker Moore 0.12.1-release
4 years ago Matt Rogers 1.0-branch
3 years, 11 months ago Matt Rogers 1.2_branch
3 years, 1 month ago Parker Moore v1-stable
12 months ago Ben Balter pages-as-documents
10 months ago Jordon Bedwell make-jekyll-parallel
6 months ago Pat Hawks to_integer
5 months ago Parker Moore 3.4-stable-backport-5920
4 months ago Parker Moore yajl-ruby-2-4-patch
4 weeks ago Parker Moore 3.4-stable
3 weeks ago Parker Moore rouge-1-and-2
19 hours ago jekyllbot master
Saya menulis blog post tentang bagaimana berbagai potongan-potongan pekerjaan.
Aku punya masalah yang sama, jadi saya menulis sebuah Ruby gem disebut Ranting. Ini daftar cabang-cabang dalam urutan kronologis (terbaru pertama), dan juga dapat membiarkan anda menetapkan usia max sehingga anda don't daftar semua cabang (jika anda memiliki banyak dari mereka). Misalnya:
$ twig
issue status todo branch
----- ------ ---- ------
2013-01-26 18:00:21 (7m ago) 486 In progress Rebase optimize-all-the-things
2013-01-26 16:49:21 (2h ago) 268 In progress - whitespace-all-the-things
2013-01-23 18:35:21 (3d ago) 159 Shipped Test in prod * refactor-all-the-things
2013-01-22 17:12:09 (4d ago) - - - development
2013-01-20 19:45:42 (6d ago) - - - master
Hal ini juga memungkinkan anda menyimpan properti kustom untuk masing-masing cabang, misalnya, tiket id, status, todos, dan menyaring daftar cabang sesuai dengan sifat-sifat ini. Info lebih lanjut: http://rondevera.github.io/twig/
FYI, jika anda'd ingin mendapatkan daftar baru memeriksa cabang (sebagai lawan baru-baru ini berkomitmen), anda dapat menggunakan Git's reflog:
$ git reflog | egrep -io "moving from ([^[:space:]]+)" | awk '{ print $3 }' | head -n5
master
stable
master
some-cool-feature
feature/improve-everything
Berikut ini adalah script lain yang melakukan apa yang semua skrip lain lakukan. Bahkan, ia menyediakan fungsi untuk shell anda.
Kontribusinya adalah bahwa hal itu menarik beberapa warna dari Git konfigurasi (atau menggunakan default).
# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
local reset_color=`tput sgr0`
local subject_color=`tput setaf 4 ; tput bold`
local author_color=`tput setaf 6`
local target=refs/heads
local branch_color=`git config --get-color color.branch.local white`
if [ "$1" = -r ]
then
target=refs/remotes/origin
branch_color=`git config --get-color color.branch.remote red`
fi
git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}
Berikut ini's sedikit script yang saya gunakan untuk beralih di antara beberapa cabang:
#!/bin/bash
# sudo bash
re='^[0-9]+$'
if [[ "$1" =~ $re ]]; then
lines="$1"
else
lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"
# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
echo -n "Checkout to: "
read index
done
branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear
Menggunakan dua alias:
recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'
Hanya menyebut bahwa dalam repositori Git, dan itu akan menunjukkan anda terakhir N cabang (10 secara default) dan sejumlah samping masing-masing. Masukan jumlah cabang, dan cek out:
Hal ini didasarkan pada saeedgnu's version, tetapi dengan arus cabang yang ditunjukkan dengan bintang dan warna, dan hanya menunjukkan apa-apa yang tidak digambarkan sebagai "bulan" atau "tahun" lalu:
current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
--format='%(refname:short)|%(committerdate:relative)' \
| grep -v '\(year\|month\)s\? ago' \
| while IFS='|' read branch date
do
start=' '
end=''
if [[ $branch = $current_branch ]]; then
start='* \e[32m'
end='\e[0m'
fi
printf "$start%-30s %s$end\\n" "$branch" "$date"
done
Diterima baris perintah jawaban batu-batu, tetapi jika anda ingin sesuatu yang lebih cantik, seperti GUI, dan asal anda === "github".
Anda dapat mengklik "cabang-Cabang" dalam repositori. Atau memukul URL secara langsung: https://github.com/ORGANIZATION_NAME/REPO_NAME/branches