Saya ingin mempertahankan (untuk saat ini) kemampuan untuk menautkan Git changesets ke workitem yang disimpan di TFS.
Saya sudah menulis alat (menggunakan kait dari Git) di mana saya bisa menyuntikkan workitemidentifiers ke dalam pesan dari Git changeset.
Namun, saya juga ingin menyimpan pengidentifikasi komit Git (hash) ke dalam bidang workitem TFS khusus. Dengan cara ini saya bisa memeriksa workitem di TFS dan melihat apa yang terkait dengan perubahan Git dengan workitem.
Bagaimana saya bisa dengan mudah mengambil hash dari commit saat ini dari Git?
sumber
--verify
menyiratkan bahwa:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
mengembalikan versi pendek dari hash, kalau-kalau ada yang bertanya-tanya.--short
, seperti--short=12
, untuk mendapatkan jumlah digit tertentu dari hash.--short=N
adalah tentang jumlah digit minimal ; git menggunakan jumlah digit yang lebih besar jika dipersingkat satu tidak dapat dibedakan dari komit yang disingkat. Coba misalnyagit rev-parse --short=2 HEAD
ataugit log --oneline --abbrev=2
.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Jika Anda hanya menginginkan hash yang disingkat:
Selanjutnya, menggunakan% H adalah cara lain untuk mendapatkan hash yang panjang.
sumber
git log
porselen dangit rev-parse
pipa.git checkout 33aa44; git log -n 1
memberi saya33aa44
. Apa versi git yang Anda gunakan?Satu lagi, menggunakan git log:
Ini sangat mirip dengan @outofculture meskipun sedikit lebih pendek.
sumber
HEAD
.HEAD
untuk komit ini daripada branche bernama kenal sebagai kepala terpisah .Untuk mendapatkan SHA lengkap:
Untuk mendapatkan versi singkat:
sumber
git
commit
hash diperlukan, seperti satu dari hash yang sedangbranch
Anda kerjakan dan amaster
branch
, Anda juga bisa menggunakangit rev-parse FETCH_HEAD
jika Anda membutuhkan hash untuk apamaster
commit
yang Andamerge
masukkan ke arus Andabranch
. misalnya jika Anda memilikibranch
esmaster
danfeature/new-feature
untuk repo yang diberikan., sementarafeature/new-feature
Anda dapat menggunakangit fetch origin master && git merge FETCH_HEAD
dan kemudiangit rev-parse --short FETCH_HEAD
jika Anda membutuhkancommit
hash darimaster
Anda hanyamerge
d dalam untuk setiap skrip yang mungkin Anda miliki.Untuk kelengkapan, karena belum ada yang menyarankannya.
.git/refs/heads/master
adalah file yang hanya berisi satu baris: hash dari commit terbarumaster
. Jadi Anda bisa membacanya dari sana.Atau, sebagai perintah:
Memperbarui:
Perhatikan bahwa git sekarang mendukung penyimpanan beberapa head ref di file pack-ref alih-alih sebagai file di folder / refs / heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
sumber
master
, yang belum tentu benar.master
..git/HEAD
biasanya menunjuk ke ref, jika Anda memiliki SHA1 di sana, Anda berada dalam mode kepala terpisah..git
subdirektori, yang belum tentu demikian. Lihat--separate-git-dir
bendera digit init
halaman manual.Komit hash
Disingkat melakukan hash
Klik di sini untuk
git show
contoh lebih lanjut .sumber
Selalu ada
git describe
juga. Secara default itu memberi Anda -sumber
git describe --long --dirty --abbrev=10 --tags
itu akan memberi saya sesuatu seperti7.2.0.Final-447-g65bf4ef2d4
447 yang dilakukan setelah tag 7.2.0.Final dan 10 intisari pertama SHA-1 global pada HEAD saat ini adalah "65bf4ef2d4". Ini sangat bagus untuk string versi. Dengan --long ia akan selalu menambahkan jumlah (-0-) dan hash, bahkan jika tag benar-benar cocok.git describe --always
akan "menampilkan objek komit yang disingkat unik sebagai mundur"git describe --tags --first-parent --abbrev=11 --long --dirty --always
. The--always
pilihan berarti memberikan hasil (hash) bahkan jika tidak ada tag. The--first-parent
berarti itu tidak bingung dengan komit penggabungan dan hanya mengikuti item pada cabang saat ini. Perhatikan juga bahwa--dirty
akan menambahkan-dirty
hasil jika cabang saat ini memiliki perubahan yang tidak dikomit.Menggunakan
git rev-list --max-count=1 HEAD
sumber
Jika Anda perlu menyimpan hash dalam sebuah variabel selama skrip, Anda bisa menggunakannya
Atau, jika Anda hanya menginginkan 10 karakter pertama (seperti yang dilakukan github.com)
sumber
--short
atau--short=number
untukgit rev-parse
; tidak perlu menggunakan pipa dancut
.Jika Anda ingin cara super-hacky untuk melakukannya:
Pada dasarnya, git menyimpan lokasi HEAD di .git / HEAD, dalam bentuk
ref: {path from .git}
. Perintah ini membacanya, memotong "ref:", dan membacakan file apa pun yang ditunjukkan.Ini, tentu saja, akan gagal dalam mode kepala terpisah, karena KEPALA tidak akan menjadi "ref: ...", tetapi hash itu sendiri - tetapi Anda tahu, saya tidak berpikir Anda berharap bahwa banyak kecerdasan dalam bash Anda -linier. Jika Anda tidak berpikir titik koma selingkuh, ...
sumber
sh
. Setengah jam komentar dokumentasi kemudian, dan ini intiCara paling ringkas yang saya tahu:
Jika Anda menginginkan jumlah digit hash tertentu, Anda dapat menambahkan:
sumber
git show
adalah apa yang dikenal sebagai perintah porselen (yaitu yang menghadap pengguna), dan karenanya tidak boleh digunakan dalam skrip karena outputnya dapat berubah. Jawaban di atas (git rev-parse --short HEAD
) harus digunakan sebagai gantinya.git help show
untukporcelain
.--porcelain
, itulah sebabnya ini membingungkan. Anda dapat menemukan perincian dalam jawaban hebat ini oleh VonCMungkin Anda menginginkan alias sehingga Anda tidak harus mengingat semua detail yang bagus. Setelah melakukan salah satu langkah di bawah ini, Anda dapat cukup mengetik:
Menindaklanjuti jawaban yang diterima , berikut adalah dua cara untuk mengatur ini:
1) Ajarkan git dengan cara eksplisit dengan mengedit konfigurasi global (jawaban asli saya):
2) Atau jika Anda suka jalan pintas untuk mengajar git jalan pintas, seperti yang baru-baru ini dikomentari oleh Adrien:
Dari sini, gunakan
git lastcommit
untuk menampilkan hash komit terakhir.sumber
git config --global alias.lastcommit "rev-parse HEAD"
Saya membutuhkan sesuatu yang sedikit lebih berbeda: menampilkan sha1 penuh dari komit, tetapi menambahkan tanda bintang sampai akhir jika direktori kerja tidak bersih. Kecuali saya ingin menggunakan banyak perintah, tidak ada opsi di jawaban sebelumnya yang berfungsi.
Inilah satu-satunya liner yang berfungsi:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Hasil:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
Penjelasan: menjelaskan (menggunakan tag beranotasi) komit saat ini, tetapi hanya dengan tag yang mengandung "BUKAN TAG". Karena tag tidak dapat memiliki spasi, ini tidak pernah cocok dengan tag dan karena kami ingin menunjukkan hasilnya
--always
, perintah akan kembali menampilkan penuh (--abbrev=0
) sha1 dari komit dan menambahkan tanda bintang jika direktori kerja adalah--dirty
.Jika Anda tidak ingin menambahkan tanda bintang, ini berfungsi seperti semua perintah lain di jawaban sebelumnya:
git describe --always --abbrev=0 --match "NOT A TAG"
Hasil:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
sumber
--match "NOT A TAG"
. Diuji dalam git 2.18.0 dan 2.7.4. Apakah ada situasi di mana argumen ini diperlukan?Jika Anda ingin kecepatan, pendekatan yang disebutkan oleh Deestan
secara signifikan lebih cepat daripada metode lain yang terdaftar di sini sejauh ini.
sumber
show-ref
tampaknya saya untuk menjadi pilihan terbaik untuk scripting, karena itu adalah perintah pipa dan dengan demikian dijamin (atau setidaknya sangat mungkin) tetap stabil dalam rilis mendatang: jawaban lainnya menggunakanrev-parse
,show
,describe
, ataulog
, yang semua perintah porselen. Dan dalam kasus-kasus di mana kecepatan bukan dari esensi, catatan dari halamanshow-ref
manual berlaku: 'Penggunaan utilitas ini didorong untuk secara langsung mengakses file di bawah direktori .git.'Berikut ini adalah satu-liner di Bash shell menggunakan membaca langsung dari file git:
Anda perlu menjalankan perintah di atas di folder git root Anda.
Metode ini dapat berguna ketika Anda telah menyimpan file, tetapi
git
perintah belum diinstal.Jika tidak berhasil, periksa di
.git/refs/heads
folder jenis kepala apa yang Anda miliki.sumber
di dir-home Anda di file ".gitconfig" tambahkan yang berikut ini
maka Anda akan memiliki perintah yang lebih mudah untuk diingat:
sumber
Pada git bash, cukup jalankan $ git log -1
Anda akan melihat, baris-baris ini mengikuti perintah Anda.
sumber
Berikut ini adalah implementasi akses langsung lainnya:
Ini juga berfungsi di http yang berguna untuk arsip paket lokal (saya tahu: untuk situs web publik, tidak disarankan untuk membuat direktori .git dapat diakses):
sumber
Ini cara lain melakukannya dengan :)
sumber
Contoh output:
ref: refs/heads/master
Parsing:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
Jika Anda memiliki windows maka Anda dapat mempertimbangkan untuk menggunakan wsl.exe:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
Keluaran:
refs/heads/master
Nilai ini dapat digunakan untuk mendapatkan checkout nanti tetapi menjadi menunjuk ke SHA-nya. Untuk membuatnya menunjuk ke cabang aktual saat ini dengan namanya lakukan:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
Output:
master
sumber