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.
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}$"
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.
git rev-list HEAD | tail -n 1
dangit rev-list --max-parents=0 HEAD
tidak mengembalikan nilai hash yang sama untuk saya. Yang menggunakan--max-parents=0
ini sebenarnya mendapatkan komit awal sekalipun. Hanya berpikir saya akan menunjukkan bahwa yang terakhir tampaknya lebih dapat diandalkan.--topo-order
kerev-list
harus memperbaikinya, meskipun saya pikir--max=parents=0
jawabannya adalah yang terbaik.git rev-list HEAD | tail -n 1
adalah pilihan yang lebih stabil.sumber
git rev-list --max-parents=0 HEAD
mengembalikan 3 komit.