Cari tahu pembuat cabang Git

159

Saya ingin mencari tahu siapa yang membuat cabang.

Saya bisa melakukannya dengan:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

Namun, ini mengembalikan committer terakhir per cabang, belum tentu orang yang membuat cabang.

Ofir Farchy
sumber
7
Anda tidak bisa mendapatkan penulis / pembuat cabang di git. Apa yang Anda lakukan di sini adalah mendapatkan penulis dari ujung cabang. Ini akan berubah segera setelah seseorang mendorong komit baru di sana.
sylvain.joyeux
1
Penafian: Asumsi implisit dalam pertanyaan / jawaban ini adalah "dalam alur kerja dengan hanya satu orang per cabang ". Dalam alur kerja lain di mana setidaknya dua rekan kerja berbagi cabang, informasi ini (pencipta cabang) tidak dapat diperoleh melalui git, dan jawaban di atas dapat mengarahkan seseorang ke asumsi yang salah.
RomainValeri

Jawaban:

56

Cabang tidak lain adalah pointer komit. Karena itu, ia tidak melacak metadata seperti "siapa yang menciptakan saya." Lihat diri mu sendiri. Coba cat .git/refs/heads/<branch>di repositori Anda.

Itu ditulis, jika Anda benar-benar melacak informasi ini di repositori Anda, periksa deskripsi cabang. Mereka memungkinkan Anda untuk melampirkan metadata sewenang-wenang ke cabang, setidaknya secara lokal.

Juga jawaban DarVar di bawah ini adalah cara yang sangat cerdas untuk mendapatkan informasi ini.

Christopher
sumber
Bagi saya ini ada di. Git / refs / heads / <branch> "ref" jamak
Jeffrey LeCours
4
Jawaban DarVar, walaupun mungkin bermanfaat bagi sebagian orang, bukanlah jawaban yang akurat. Ini hanyalah cara yang lebih ringkas untuk melakukan apa yang sudah dilakukan oleh penulis pertanyaan asli (yaitu, mendapatkan nama komiter terakhir ke cabang).
peabody
296

Buat daftar cabang Git jarak jauh berdasarkan penulis diurutkan berdasarkan tanggal committer:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate
DarVar
sumber
8
Ini adalah orang terakhir yang berkomitmen pada cabang itu. Karena cabang hanyalah pointer ke komit.
DarVar
7
Haruskah ini bekerja pada Windows? Saya mendapat "Input file ditentukan dua kali."
Steve Chambers
27
Dengan pemformatan tabular: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(mendapat ide dari stackoverflow.com/a/3631819 - mungkin perlu menyesuaikan angka dalam awk printf tergantung pada panjang dat maksimum / panjang nama penulis)
Gary S. Weaver
15
Jika belum ada komit pada cabang dan jika telah dibuat dari master, "penulis cabang" sama sekali tidak terkait dengan cabang itu, tetapi hanya pengendara terakhir pada master. Jika Anda menarik perubahan dari master dan ini adalah fast-forward, itu lagi-lagi komuter terakhir pada master, yang mungkin tidak pernah bekerja pada cabang itu.
Gustave
9
Sementara jawaban dan perintah ini berpotensi bermanfaat, saya merasa itu adalah jawaban yang menyesatkan untuk pertanyaan itu. Ini mencantumkan nama penulis di semua cabang yang merupakan komiter terakhir di cabang. Ada beberapa keadaan di mana itu tidak akan benar-benar menjadi pencipta cabang. Jawaban sebenarnya adalah bahwa git tidak menyimpan informasi ini.
peabody
46

Saya mengubah jawaban sebelumnya dengan menggunakan --sortbendera dan menambahkan beberapa warna / pemformatan:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes
Mike
sumber
1
sempurna untuk menyalahkan dalam warna
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamedP
sumber
8

Menambahkan ke jawaban DarVar :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PS: Kami menggunakan AWK untuk cukup mencetak penulis dan cabang jarak jauh.

suryakrupa
sumber
3
itu hanya berfungsi jika nama penulis adalah satu kata. Jika dipisahkan dari nama depan dan belakang, maka Anda akan melihat nama belakang alih-alih nama cabang ...
Legato
5

Anda dapat mengetahui siapa yang membuat cabang di repositori lokal Anda dengan

git reflog --format=full

Contoh output:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

Tapi ini mungkin tidak berguna karena biasanya di repositori lokal Anda hanya Anda membuat cabang.

Informasi disimpan di cabang ./.git/logs/refs/head/ . Contoh konten:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

Komit terakhir dalam contoh ini berasal dari pengguna "b" sedangkan cabang "b2" dibuat oleh pengguna "a". Jika Anda mengubah nama pengguna, Anda dapat memverifikasi bahwa git reflog mengambil informasi dari log dan tidak menggunakan pengguna lokal.

Saya tidak tahu tentang kemungkinan untuk mengirimkan informasi log lokal ke repositori pusat.

Gustave
sumber
4

Kita bisa mencari tahu berdasarkan authorname

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC
tech2504
sumber
1

Asumsi:

  1. cabang terbuat dari master
  2. belum bergabung untuk masterbelum

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1
Trident D'Gao
sumber
0

Saya tahu ini bukan sepenuhnya ruang lingkup pertanyaan, tetapi jika Anda merasa perlu untuk memfilter hanya dilakukan oleh penulis tertentu, Anda selalu dapat melakukan pipe to grep :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

selamat coding! :)

alpukat yesus
sumber
0

bagi mereka yang mencari DESC ... ini sepertinya berhasil --sort=-

untuk pemformatan, baru dalam hal ini ... mataku kehilangan sebagian dari darahnya

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

ref lebih lanjut: https://stackoverflow.com/a/5188364/10643471

rob bee
sumber
-1

Sejauh yang saya tahu, Anda mungkin melihat apakah Anda adalah pencipta cabang saja. Ini ditunjukkan oleh baris pertama di .git / ref / head / <branch>. Jika diakhiri dengan "Created from HEAD" Anda adalah penciptanya.

Kendor
sumber