Saya mencoba melakukan hal-hal mewah di sini dengan kait Git, tapi saya tidak benar-benar tahu bagaimana melakukannya (atau jika mungkin).
Yang perlu saya lakukan adalah: di setiap commit saya ingin mengambil hash-nya dan kemudian memperbarui file di commit dengan hash ini.
Ada ide?
Jawaban:
Saya akan merekomendasikan melakukan sesuatu yang mirip dengan apa yang ada dalam pikiran Anda: menempatkan SHA1 dalam file yang tidak terlacak , yang dihasilkan sebagai bagian dari proses pembangunan / instalasi / penyebaran. Ini jelas mudah dilakukan (
git rev-parse HEAD > filename
atau mungkingit describe [--tags] > filename
), dan ia menghindari melakukan sesuatu yang gila seperti berakhir dengan file yang berbeda dari apa yang dilacak git.Kode Anda kemudian dapat mereferensikan file ini ketika membutuhkan nomor versi, atau proses build dapat memasukkan informasi ke dalam produk akhir. Yang terakhir sebenarnya adalah bagaimana git sendiri mendapatkan nomor versinya - proses build mengambil nomor versi dari repo, lalu membuatnya menjadi executable.
sumber
Tidak mungkin untuk menulis hash komit saat ini: jika Anda berhasil pra-menghitung hash komit di masa depan - itu akan berubah segera setelah Anda memodifikasi file apa pun.
Namun, ada tiga opsi:
pre-commit
, simpan hash komit sebelumnya :) Anda tidak memodifikasi / menyisipkan komit dalam kasus 99,99%, jadi, ini AKAN bekerja. Dalam kasus terburuk Anda masih dapat mengidentifikasi revisi sumber.Saya sedang mengerjakan skrip kait, akan mempostingnya di sini 'ketika sudah selesai', tetapi masih - lebih awal dari Duke Nukem Forever dirilis :))
Perbarui : kode untuk
.git/hooks/pre-commit
:Sekarang satu-satunya yang kita butuhkan adalah alat yang mengubah
prev_commit,branch
pasangan menjadi hash komit :)Saya tidak tahu apakah pendekatan ini dapat membedakan penggabungan komitmen. Akan segera memeriksanya
sumber
Seseorang menunjuk saya ke bagian "man gitattributes" pada ident, yang memiliki ini:
ident
Jika Anda memikirkannya, ini juga yang dilakukan CVS, Subversion, dll. Jika Anda melihat repositori, Anda akan melihat bahwa file di repositori selalu berisi, misalnya, $ Id $. Tidak pernah mengandung perluasan itu. Hanya pada checkout bahwa teks diperluas.
sumber
ident
adalah hash untuk file itu sendiri, bukan terburu-buru dari komit. Dari git-scm.com/book/en/… : "Namun, hasil itu penggunaannya terbatas. Jika Anda telah menggunakan substitusi kata kunci dalam CVS atau Subversion, Anda dapat memasukkan datestamp - SHA tidak terlalu membantu, karena itu cukup acak dan Anda tidak dapat mengetahui apakah satu SHA lebih tua atau lebih baru dari yang lain. "filter
membutuhkan kerja, tetapi itu bisa membuat info komit menjadi (dan keluar dari) file.Ini dapat dicapai dengan menggunakan
filter
atribut di gitattributes . Anda harus memberikansmudge
perintah yang memasukkan id komit, danclean
perintah yang menghapusnya, sehingga file yang dimasukkan tidak akan berubah hanya karena id komit.Dengan demikian, id komit tidak pernah disimpan dalam gumpalan file; itu hanya diperluas di copy pekerjaan Anda. (Sebenarnya memasukkan id komit ke dalam gumpalan akan menjadi tugas rekursif tanpa batas. ☺) Siapa pun yang mengkloning pohon ini perlu mengatur atribut untuk dirinya sendiri.
sumber
Pikirkan di luar kotak komit!
masukkan ini ke file hooks / post-checkout
Versi ini akan tersedia di mana saja Anda menggunakannya.
sumber
Saya tidak berpikir Anda benar-benar ingin melakukan itu, karena ketika file di komit diubah, hash komit juga berubah.
sumber
Biarkan saya mengeksplorasi mengapa ini adalah masalah yang menantang menggunakan internal git. Anda bisa mendapatkan sha1 dari commit saat ini dengan
Pada dasarnya Anda menjalankan checksum sha1 pada pesan yang dikembalikan oleh
git cat-file commit HEAD
. Dua hal segera melompat keluar sebagai masalah ketika Anda memeriksa pesan ini. Satu adalah pohon sha1 dan yang kedua adalah waktu komit.Sekarang waktu komit mudah dijaga dengan mengubah pesan dan menebak berapa lama waktu untuk membuat komit atau penjadwalan untuk komit pada waktu tertentu. Masalah sebenarnya adalah pohon sha1, yang bisa Anda dapatkan
git ls-tree $(git write-tree) | git mktree
. Pada dasarnya Anda melakukan checksum sha1 pada pesan dari ls-tree, yang merupakan daftar semua file dan checksum sha1 mereka.Oleh karena itu komit Anda sha1 checksum tergantung pada pohon Anda sha1 checksum, yang secara langsung tergantung pada file sha1 checksum, yang melengkapi lingkaran dan tergantung pada komit sha1. Dengan demikian Anda memiliki masalah melingkar dengan teknik yang tersedia untuk saya sendiri.
Dengan checksum yang kurang aman , telah terbukti memungkinkan untuk menulis checksum file ke dalam file itu sendiri melalui brute force; Namun, saya tidak tahu ada pekerjaan yang menyelesaikan tugas itu dengan sha1. Ini bukan tidak mungkin, tetapi hampir tidak mungkin dengan pemahaman kita saat ini (tetapi siapa tahu mungkin dalam beberapa tahun ini akan menjadi sepele). Namun, masih ini bahkan lebih sulit untuk memaksa karena Anda harus menulis (melakukan) checksum dari (pohon) checksum dari (gumpalan) checksum ke dalam file.
sumber