Bagaimana referensi komit awal?

131

Saya punya skrip yang perlu referensi komit awal di repositori. git memiliki referensi khusus HEAD, tetapi tidak memiliki yang sesuai TAIL. Saya tidak dapat menemukan apa pun di dalam git help rev-parseyang tampaknya membantu saya.

Inilah yang ingin saya lakukan:

git show TAIL

Inilah satu opsi yang saya miliki:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

Itu cukup hacky dan tergantung pada output git log tidak berubah.

Saat ini saya hanya menandai komit awal dan menggunakannya sebagai refspec saya. Namun, saya ingin merilis alat umum, jadi itu bukan pilihan bagus.

Bryan Larsen
sumber

Jawaban:

151

Jangan gunakan git-log untuk skrip: gunakan salah satu git-rev-list, atau git-logdengan format ( --format=*<sth>*opsi) khusus.

Ada masalah tambahan dengan pertanyaan Anda: mungkin ada lebih dari satu komit root TAIL (parentless commit) dalam repositori (bahkan jika kami mendiskon cabang yang terputus, seperti 'html', 'man' dan 'todo' di git.git gudang). Ini biasanya merupakan hasil dari bergabungnya proyek yang terpisah dalam satu proyek, atau menggunakan gabungan subtree dari proyek yang dikembangkan secara terpisah.

Misalnya repositori git memiliki 6 commit root: git-gui, gitk (subtree-gabungan), gitweb (digabung, tidak lagi dikembangkan secara terpisah), alat git mail (digabung sangat awal dalam sejarah proyek), dan p4-fast-export ( mungkin tidak disengaja). Itu tidak termasuk akar dari cabang 'html dan' man ', cabang "convenience" yang berisi dokumentasi yang dibuat sebelumnya, dan cabang' todo 'dengan daftar dan skrip TODO.


Jika Anda memiliki git 1.7.4.2 atau yang lebih baru, Anda dapat menggunakan --max-parentsopsi:

$ git rev-list --max-parents=0 HEAD

Jika tidak, Anda bisa mendapatkan daftar semua commit tanpa induk (root) yang dapat diakses dari cabang saat ini menggunakan:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Jakub Narębski
sumber
Bagi saya, git rev-list HEAD | tail -n 1dan git rev-list --max-parents=0 HEADtidak mengembalikan nilai hash yang sama untuk saya. Yang menggunakan --max-parents=0ini sebenarnya mendapatkan komit awal sekalipun. Hanya berpikir saya akan menunjukkan bahwa yang terakhir tampaknya lebih dapat diandalkan.
jbranchaud
1
@Treebranch ini bisa terjadi jika Anda memiliki komitmen dengan stempel waktu ganjil. menambahkan --topo-orderke rev-listharus memperbaikinya, meskipun saya pikir --max=parents=0jawabannya adalah yang terbaik.
jthill
35

git rev-list HEAD | tail -n 1 adalah pilihan yang lebih stabil.

Robert Munteanu
sumber
14
Ini akan mengembalikan salah satu dari komitmen ekor; mungkin ada lebih dari satu root (tanpa orangtua) komit
Jakub Narębski
Jawaban ini bekerja dengan sempurna dan hanya mengembalikan satu komit sementara git rev-list --max-parents=0 HEADmengembalikan 3 komit.
protoEvangelion
tail juga bukan perintah yang ada secara default di windows - bekerja di GitBash di windows sekalipun. :)
Johny Skovdal