Pindah dari CVS ke Git: setara $ Id $?

124

Saya membaca banyak pertanyaan yang menanyakan tentang alat kontrol kode sumber sederhana dan Git sepertinya pilihan yang masuk akal. Saya sudah menjalankannya, dan sejauh ini berfungsi dengan baik. Salah satu aspek yang saya suka tentang CVS adalah penambahan otomatis nomor versi.

Saya mengerti bahwa ini kurang masuk akal dalam repositori terdistribusi, tetapi sebagai pengembang, saya menginginkan / membutuhkan sesuatu seperti ini. Izinkan saya menjelaskan alasannya:

Saya menggunakan Emacs. Secara berkala saya memeriksa dan mencari versi baru dari file sumber Lisp untuk paket pihak ketiga. Katakanlah saya punya file, foo.el, yang menurut header, adalah versi 1.3; jika saya mencari versi terbaru dan melihat versi 1.143 atau 2.6 atau apa pun, saya tahu saya cukup jauh di belakang.

Jika sebaliknya saya melihat beberapa hash 40 karakter, saya tidak akan tahu mana yang nanti atau tahu berapa lama nanti. Saya benar-benar akan membencinya jika saya harus memeriksa ChangeLogs secara manual hanya untuk mendapatkan gambaran tentang seberapa lama saya.

Sebagai seorang pengembang, saya ingin menyampaikan rasa hormat ini, seperti yang saya lihat, kepada orang-orang yang menggunakan keluaran saya (dan mungkin saya bercanda bahwa ada orang, tapi mari kita tinggalkan sejenak). Saya tidak ingin mengingat untuk selalu menaikkan angka sialan itu sendiri, atau cap waktu atau semacamnya. Itu adalah PITA yang nyata, dan saya tahu itu dari pengalaman.

Jadi alternatif apa yang saya miliki? Jika saya tidak bisa mendapatkan setara $ Id: $, bagaimana lagi saya bisa memberikan apa yang saya cari?

Saya harus menyebutkan bahwa harapan saya adalah bahwa pengguna akhir TIDAK akan menginstal Git dan bahkan jika mereka memilikinya, tidak akan memiliki repositori lokal (memang, saya berharap tidak membuatnya tersedia dengan cara itu).

Joe Casadonte
sumber

Jawaban:

67

SHA hanyalah salah satu representasi dari sebuah versi (meskipun kanonik). The git describeperintah menawarkan orang lain dan melakukannya dengan cukup baik.

Misalnya, ketika saya menjalankan git describedi cabang master sumber klien memcache Java saya , saya mendapatkan ini:

2.2-16-gc0cd61a

Itu mengatakan dua hal penting:

  1. Tepat ada 16 komit di pohon ini sejak 2.2
  2. The tepat source dapat ditampilkan pada clone orang lain.

Katakanlah, misalnya, Anda mengemas versionfile dengan sumbernya (atau bahkan menulis ulang semua konten untuk didistribusikan) untuk menunjukkan nomor itu. Katakanlah bahwa versi terpaket adalah 2.2-12-g6c4ae7a(bukan rilis, tetapi versi yang valid).

Sekarang Anda dapat melihat dengan tepat seberapa jauh Anda tertinggal (4 komit), dan Anda dapat melihat dengan tepat 4 komit mana:

# The RHS of the .. can be origin/master or empty, or whatever you want.
% git log --pretty=format:"%h %an %s" 2.2-12-g6c4ae7a..2.2-16-gc0cd61a
c0cd61a Dustin Sallings More tries to get a timeout.
8c489ff Dustin Sallings Made the timeout test run on every protocol on every bui
fb326d5 Dustin Sallings Added a test for bug 35.
fba04e9 Valeri Felberg Support passing an expiration date into CAS operations.
Dustin
sumber
1
Penggunaan ini akan gagal saat Anda menggabungkan cabang pengembangan, sementara master memiliki beberapa perbaikan terbaru. Jumlah komit sejak versi terakhir akan berubah. Hash tidak dapat diandalkan karena seseorang dapat membangun kembali semuanya dengan filter-branchatau sesuatu.
LeMike
Artikel ini hanya menjelaskan mempelajari informasi, bukan menyematkannya dalam file yang dapat dieksekusi. Untuk itu Anda perlu menjalankan git describeperintah tepat sebelum Anda membangun, menyimpan output di file header, atau menanamkan nilai dalam kode Anda.
Jesse Chisholm
55

Sekarang ada dukungan untuk $ Id: $ di Git. Untuk mengaktifkannya untuk file README Anda harus memasukkan "README ident" ke dalam .gitattributes . Mendukung karakter pengganti pada nama file. Lihat man gitattributes untuk detailnya.

Sebastian Pipping
sumber
14
Ini memberi Anda sha1 dari blob, tapi bukan sha1 dari komit. Berguna, tidak hanya sebagai pengenal untuk komit.
Stephen Jennings
4
git tidak memiliki mekanisme perluasan kata kunci seperti yang $Id$disebutkan. Apa yang disimpan persis seperti yang Anda dapatkan. Bagaimanapun, versinya adalah milik koleksi lengkap file yang membuat komit, bukan satu file pada khususnya (Ide itu adalah sisa dari masa RCS, atau mungkin SCCS yang harus disalahkan di sini ... Karena CVS hanyalah memuliakan frontend ke RCS, dan SVN mencoba menjadi seperti CVS-workalike, itu macet.).
vonbrand
32

Ini bukanlah permintaan yang tidak masuk akal dari OP.

Kasus penggunaan saya adalah:

  1. Saya menggunakan Git untuk kode pribadi saya, oleh karena itu tidak ada kolaborasi dengan orang lain.
  2. Saya menyimpan skrip Bash sistem di sana yang mungkin masuk /usr/local/binsaat mereka siap.

Saya menggunakan tiga mesin terpisah dengan repositori Git yang sama di atasnya. Alangkah baiknya mengetahui "versi" dari file yang saat ini saya miliki /usr/local/bintanpa harus melakukan manual "diff -u <repo version> <version in / usr / local / bin>".

Bagi Anda yang bersikap negatif, ingatlah ada kasus penggunaan lain di luar sana. Tidak semua orang menggunakan Git untuk pekerjaan kolaboratif dengan file di repositori Git menjadi lokasi "terakhir" mereka.

Bagaimanapun, cara saya melakukannya adalah dengan membuat file atribut di repositori seperti ini:

cat .git/info/attributes
# see man gitattributes
*.sh ident
*.pl ident
*.cgi ident

Kemudian letakkan $ Id $ di suatu tempat di file (saya suka meletakkannya setelah shebang).

Komit. Perhatikan bahwa ini tidak secara otomatis melakukan ekspansi seperti yang saya harapkan. Anda harus membuat ulang file tersebut, misalnya,

git commit foo.sh
rm foo.sh
git co foo.sh

Dan kemudian Anda akan melihat perluasannya, misalnya:

$ head foo.sh
#!/bin/sh

# $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

Beberapa informasi bagus ada di Bagaimana cara mengaktifkan string ident untuk repositori Git? .

Imran-Inggris
sumber
3
Perlu dicatat bahwa ini mengidentifikasi file saat ini (gumpalan), bukan komit saat ini
CharlesB
3
Apa yang git coharus dilakukan? Saya mendapat pesan kesalahan " git: 'co' is not a git command. See 'git --help'." Harus itugit checkout ?
Peter Mortensen
23

Tidak yakin ini akan pernah ada di Git. Untuk mengutip Linus :

"Keseluruhan gagasan tentang substitusi kata kunci benar-benar konyol. Sangat sepele untuk melakukan" di luar "pelacakan konten yang sebenarnya, jika Anda ingin melakukannya saat melakukan pelepasan pohon sebagai bola tar, dll."

Sangat mudah untuk memeriksa log, meskipun - jika Anda melacak cabang stabil foo.el, Anda dapat melihat komit baru apa yang ada di log cabang stabil yang tidak ada di salinan lokal Anda. Jika Anda ingin menyimulasikan nomor versi internal CVS, Anda dapat membandingkan stempel waktu komit terakhir.

Edit: Anda harus menulis atau menggunakan skrip orang lain untuk ini, tentu saja, jangan lakukan ini secara manual.

orip
sumber
26
Ya, saya membaca bagian dari rangkaian email yang panjang itu tentang perluasan kata kunci. Sikap Linus hampir cukup untuk membuatku benar-benar marah.
Joe Casadonte
15
Ya, terkadang dia kurang sopan tetapi biasanya dia benar, dan dia pasti berada di topik perluasan kata kunci.
Bombe
Pelacakan versi diperlukan. git digunakan di banyak infrastruktur lain selain pengembangan murni di mana seseorang dapat membaca kode untuk menentukan apakah itu masuk akal. Tetapi ketika sistem kontrol revisi digunakan untuk melacak file dengan konten sewenang-wenang, maka Anda harus memiliki beberapa cara untuk mengetahui rilis resmi. git, apalagi git log tidak ada di mesin yang didorong oleh .ini, .conf, .html dan file lainnya.
rjt
7
Linus hanya mengomentari satu aspek perluasan kata kunci - pelacakan rilis. Tapi itu bukan satu-satunya tujuan itu. Kutipan itu dengan jelas menunjukkan sikap seorang pria, tetapi tidak mengatakan apa pun yang berguna tentang subjeknya. Tipikal tipuan politik "nyatakan yang jelas dengan cara yang mulia", dan kerumunan adalah milik Anda. Masalahnya adalah kerumunan menurut definisi itu bodoh, karena hanya memiliki satu otak di semua itu. Yang menjelaskan situasi dengan git dan perluasan kata kunci dengan jelas. Seorang idiot berkata "tidak" dan semua orang bersorak!
AnrDaemon
1
@AnrDaemon tidak hanya itu, git sekarang telah menambahkan dukungan $Id$melalui identatribut, seperti yang disebutkan dalam jawaban lain di sini, menunjukkan bahwa bahkan git itu sendiri bukanlah sandera bagi opini Linus.
orip
21

Seperti yang saya tulis sebelumnya :

Memiliki tag Id yang dihasilkan secara otomatis yang menunjukkan nomor versi yang masuk akal tidak mungkin dilakukan dengan alat DSCM seperti Bazaar karena jalur pengembangan setiap orang dapat berbeda dari yang lain. Jadi seseorang dapat merujuk ke versi "1.41" dari sebuah file tetapi versi "1.41" Anda dari file itu berbeda.

Pada dasarnya, $ Id $ tidak masuk akal dengan Bazaar, Git, dan alat manajemen kode sumber terdistribusi lainnya.

Bombe
sumber
6
Benar, saya membacanya sebelum memposting, dan itulah mengapa saya meminta solusi yang lebih umum untuk masalah yang mendasarinya. Saya pikir keinginan untuk file individu untuk memiliki versi # adalah sah, seperti ketidakmampuan git untuk memberikan solusi.
Joe Casadonte
Ini bukan ketidakmampuan Git, ini adalah ketidakmampuan semua SCM terdistribusi. Jika Anda benar-benar menginginkan nomor versi yang bermakna, gunakan Subversion, atau CVS, atau sistem terpusat lainnya.
Bombe
7
apa salahnya dengan hanya mengeluarkan hash dan bukan "nomor versi"? Saya ingin pernyataan log, debug halaman web, dan opsi "--version" pada skrip internal yang akan dengan mudah memberi tahu saya revisi apa yang sedang berjalan di mana, jadi saya dapat memeriksa hash spesifik itu dan melihat mengapa itu berperilaku seperti itu. Ini menyederhanakan pengelolaan aplikasi yang diterapkan .... dan saya tidak ingin beberapa pengait komit yang menganggap setiap komit sebagai perubahan ke setiap file yang memiliki tag $ Id $ di dalamnya.
nairbv
1
hash file yang sedang Anda kerjakan akan bekerja sama dengan "versi", selama Anda dapat mencarinya di git dengan id itu
Erik Aronesty
2
@ Brian - berdasarkan pengeditan OP, pengguna akhir ingin mengetahui nomor versi tetapi tidak memiliki akses ke git atau log git. Dalam hal ini, hash adalah angka yang tidak berarti, bukan nomor versi. DSCM tidak memberikan bantuan untuk memenuhi kebutuhan ini.
Jesse Chisholm
10

Saya memiliki masalah yang sama. Saya perlu memiliki versi yang lebih sederhana daripada string hash dan tersedia untuk orang-orang yang menggunakan alat tersebut tanpa perlu terhubung ke repositori.

Saya melakukannya dengan hook pra-komit Git dan mengubah skrip saya agar dapat memperbarui dirinya sendiri secara otomatis.

Saya mendasarkan versi dari jumlah komit yang dilakukan. Ini adalah kondisi perlombaan ringan karena dua orang dapat berkomitmen pada waktu yang sama dan keduanya berpikir mereka melakukan nomor versi yang sama, tetapi kami tidak memiliki banyak pengembang dalam proyek ini.

Sebagai contoh, saya memiliki skrip yang saya check in yang ada di Ruby, dan saya menambahkan kode ini ke dalamnya - ini adalah kode yang cukup sederhana sehingga mudah untuk porting ke bahasa yang berbeda jika Anda memeriksa sesuatu dalam bahasa yang berbeda (meskipun jelas ini tidak akan dengan mudah bekerja dengan check-in yang tidak dapat dijalankan seperti file teks). Aku sudah menambahkan:

MYVERSION = '1.090'
## Call script to do updateVersion from .git/hooks/pre-commit
def updateVersion
  # We add 1 because the next commit is probably one more - though this is a race
  commits = %x[git log #{$0} | grep '^commit ' | wc -l].to_i + 1
  vers = "1.%0.3d" % commits

  t = File.read($0)
  t.gsub!(/^MYVERSION = '(.*)'$/, "MYVERSION = '#{vers}'")
  bak = $0+'.bak'
  File.open(bak,'w') { |f| f.puts t }
  perm = File.stat($0).mode & 0xfff
  File.rename(bak,$0)
  File.chmod(perm,$0)
  exit
end

Dan kemudian saya menambahkan opsi baris perintah (-updateVersion) ke skrip jadi jika saya menyebutnya sebagai "tool -updateVersion" maka itu hanya memanggil updateVersion untuk alat yang mengubah nilai "MYVERSION" itu sendiri dan kemudian keluar (Anda bisa memilikinya juga memperbarui file lain jika dibuka juga jika Anda mau).

Setelah itu diatur, saya pergi ke kepala Git dan membuat skrip bash satu baris yang dapat dieksekusi .git/hooks/pre-commit.

Skrip hanya berubah ke kepala direktori Git dan memanggil skrip saya dengan -updateVersion.

Setiap kali saya memeriksa apakah skrip pra-komit dijalankan yang menjalankan skrip saya dengan -updateVersion, dan kemudian variabel MYVERSION diperbarui berdasarkan pada jumlah komit yang akan dibuat. Sihir!

David Ljung Madison Stellar
sumber
Jadi, apakah skrip Ruby Anda harus disebut updateVersion git updateVersion? Tolong berikan beberapa contoh bagaimana itu disebut.
rjt
Saya membuat opsi (-updateVersion) ke skrip yang saya periksa yang memanggil fungsi 'updateVersion' (dalam hal ini saya mencoba mengubah nomor versi di skrip itu sendiri). Lalu saya hanya membuat perintah shell oneliner yang memanggil skrip saya dengan -updateVersion, dan kemudian memperbarui dirinya sendiri sebelum setiap checkin.
David Ljung Madison Stellar
8

Jika memiliki $ Kata kunci $ sangat penting bagi Anda, maka mungkin Anda dapat mencoba melihat Mercurial sebagai gantinya? Ini memiliki ekstensi hgkeyword yang menerapkan apa yang Anda inginkan. Mercurial menarik sebagai DVCS.

Keltia
sumber
8

Sesuatu yang dilakukan dengan repositori Git adalah menggunakan tagobjek. Ini dapat digunakan untuk menandai komit dengan semua jenis string dan dapat digunakan untuk menandai versi. Anda dapat melihat tag itu di repositori dengan git tagperintah, yang mengembalikan semua tag.

Sangat mudah untuk memeriksa tag. Misalnya, jika ada tag v1.1Anda bisa memeriksa tag itu ke cabang seperti ini:

git checkout -b v1.1

Karena ini adalah objek tingkat atas, Anda akan melihat seluruh riwayat untuk komit tersebut, serta dapat menjalankan diff, membuat perubahan, dan menggabungkan.

Tidak hanya itu, tetapi sebuah tag tetap ada, bahkan jika cabang tempatnya telah dihapus tanpa digabungkan kembali ke baris utama.

Abizern
sumber
6
Lalu, apakah ada cara untuk memasukkan tag ini ke dalam file secara otomatis dengan git? Terima kasih!
Joe Casadonte
1
Jika yang Anda maksud dengan perluasan kata kunci? Tidak sejauh yang saya tahu. jika Anda membuat produk, Anda bisa mendapatkan informasi sebagai bagian dari skrip build Anda dan memasukkannya ke suatu tempat ke dalam produk yang Anda buat. Coba man git-description yang memberikan tag terbaru, jumlah komit sejak tag ini, dan hash saat ini.
Abizern
Ya, tag dan informasi terkait lainnya sekarang dapat diedit menjadi file secara otomatis oleh git melalui export-substfitur gitattributes(5). Ini tentu saja membutuhkan penggunaan git archiveuntuk membuat rilis, dan hanya dalam file tar yang dihasilkan hasil edit substitusi akan terlihat.
Greg A. Woods
4

Jika saya mengerti dengan benar, pada dasarnya, Anda ingin tahu berapa banyak komit yang telah terjadi pada file tertentu sejak terakhir kali Anda memperbarui.

Pertama-tama, dapatkan perubahan di remote origin, tapi jangan gabungkan ke mastercabang Anda :

% git fetch

Kemudian dapatkan log perubahan yang terjadi pada file tertentu antara mastercabang Anda dan remote origin/master.

% git log master..origin/master foo.el

Ini memberi Anda pesan log dari semua komit yang telah terjadi di repositori jarak jauh sejak Anda terakhir bergabung origin/masterke dalam master.

Jika Anda hanya ingin menghitung perubahannya, gunakan pipa ke wc. Katakan, seperti ini:

% git rev-list master..origin/master foo.el | wc -l
Otto
sumber
1
Jadi, jangan gunakan log: git rev-list master..origin / master | wc -l
Dustin
4

Jika Anda hanya ingin orang lain mengetahui seberapa jauh mereka ketinggalan zaman, Git dapat memberi tahu mereka tentang hal itu dengan beberapa cara yang cukup mudah. Mereka membandingkan tanggal komit terakhir di bagasi dan bagasi Anda, misalnya. Mereka dapat menggunakan git cherryuntuk melihat berapa banyak komit yang terjadi di bagasi Anda yang tidak ada di bagasi mereka.

Jika hanya itu yang Anda inginkan, saya akan mencari cara untuk menyediakannya tanpa nomor versi.

Juga, saya tidak akan repot-repot menyampaikan kesopanan kepada siapa pun kecuali Anda yakin mereka menginginkannya. :)

cakalang
sumber
Jika tanggal boleh dibandingkan, letakkan DateTImeStamp di file. git memiliki banyak kasus penggunaan selain pengembang. TI di lapangan perlu mengetahui apakah file .INI atau .conf pada workstation yang saat ini sedang dipecahkan masalahnya mendekati apa yang ada saat ini.
rjt
Apakah stempel waktu saja sudah cukup? Cabang yang salah dapat memiliki stempel waktu yang menarik dan masih kurang tepat.
pengguna2066657
4

Untuk menerapkan perluasan ke semua file di semua sub-direktori dalam repositori, tambahkan .gitattributesfile ke direktori tingkat atas dalam repositori (yaitu tempat Anda biasanya meletakkan .gitignorefile) yang berisi:

* ident

Untuk melihat efeknya, Anda harus melakukan pembayaran file yang efektif terlebih dahulu, seperti menghapus atau mengeditnya dengan cara apa pun. Kemudian pulihkan dengan:

git checkout .

Dan Anda akan melihat $Id$diganti dengan sesuatu seperti:

$Id: ea701b0bb744c90c620f315e2438bc6b764cdb87 $

Dari man gitattributes:

ident

Saat ident atribut disetel untuk sebuah jalur, Git mengganti $ Id $ di objek blob dengan $ Id :, diikuti dengan 40 karakter nama objek blob heksadesimal, diikuti dengan tanda dolar $ saat pembayaran. Setiap urutan byte yang dimulai dengan $ Id: dan diakhiri dengan $ di file worktree diganti dengan $ Id $ saat check-in.

ID ini akan berubah setiap kali versi baru file dilakukan.

Nagev
sumber
3

RCS ID cocok untuk proyek file tunggal, tetapi untuk proyek lain $ Id $ tidak mengatakan apa-apa tentang proyek tersebut (kecuali Anda melakukan check-in palsu secara paksa ke file versi dummy).

Masih ada orang yang mungkin tertarik bagaimana mendapatkan yang setara dengan $ Penulis $, $ Tanggal $, $ Revisi $, $ RCSfile $, dll. Pada tingkat per file atau pada tingkat komit (bagaimana meletakkannya di tempat beberapa kata kunci adalah yang lain pertanyaan). Saya tidak punya jawaban tentang ini, tetapi lihat persyaratan untuk memperbaruinya, terutama ketika file (sekarang di Git) berasal dari sistem yang kompatibel dengan RCS (CVS).

Kata kunci seperti itu mungkin menarik jika sumber didistribusikan secara terpisah dari repositori Git mana pun (itulah yang juga saya lakukan). Solusi saya seperti ini:

Setiap proyek memiliki direktori sendiri, dan di root proyek saya memiliki file teks bernama .versionkonten yang menjelaskan versi saat ini (nama yang akan digunakan saat mengekspor sumber).

Saat bekerja untuk rilis berikutnya, skrip mengekstrak .versionnomor itu, beberapa deskriptor versi Git (seperti git describe) dan nomor versi monotonik dalam .build(plus host dan tanggal) ke file sumber yang dibuat secara otomatis yang ditautkan ke program akhir, sehingga Anda dapat menemukannya keluar dari sumber apa dan kapan dibangun.

Saya mengembangkan fitur baru di cabang terpisah, dan hal pertama yang saya lakukan adalah menambahkan n(untuk "berikutnya") ke .versionstring (beberapa cabang yang berasal dari root yang sama akan menggunakan .versionnomor sementara yang sama ). Sebelum rilis saya memutuskan cabang mana yang akan digabungkan (mudah-mudahan semuanya sama .version). Sebelum melakukan penggabungan, saya memperbarui .versionke nomor berikutnya (pembaruan besar atau kecil, tergantung pada fitur yang digabungkan).

U. Windl
sumber
3

Jika Anda ingin informasi git commit dapat diakses ke kode Anda, maka Anda harus melakukan langkah pra-build untuk mendapatkannya di sana. Dalam bash untuk C / C ++ mungkin terlihat seperti ini:

prebuild.sh

#!/bin/bash
commit=$(git rev-parse HEAD)
tag=$(git describe --tags --always ${commit})
cat <<EOF >version.c
#include "version.h"
const char* git_tag="${tag}";
const char* git_commit="${commit}";
EOF

dengan version.htampilan seperti:

#pragma once
const char* git_tag;
const char* git_commit;

Kemudian, di mana pun Anda membutuhkannya dalam kode #include "version.h"dan referensi Anda git_tagatau git_commitsesuai kebutuhan.

Dan Anda Makefilemungkin memiliki sesuatu seperti ini:

all: package
version:
  ./prebuild.sh
package: version
  # the normal build stuff for your project

Ini memiliki manfaat:

  • mendapatkan nilai yang saat ini benar untuk bangunan ini terlepas dari percabangan, penggabungan pemetikan ceri, dan semacamnya.

Implementasi ini prepublish.shmemiliki kekurangan:

  • memaksa kompilasi ulang meskipun git_tag/ git_committidak berubah.
  • itu tidak memperhitungkan file lokal yang dimodifikasi yang belum dilakukan tetapi mempengaruhi build.
    • gunakan git describe --tags --always --dirtyuntuk menangkap kasus penggunaan itu.
  • mencemari namespace global.

Seorang pelamun prebuild.shyang bisa menghindari masalah ini dibiarkan sebagai latihan bagi pembaca.

Jesse Chisholm
sumber
1

Saya setuju dengan mereka yang berpikir bahwa penggantian token adalah milik alat build daripada alat kontrol versi.

Anda harus memiliki beberapa alat rilis otomatis untuk menyetel ID versi di sumber Anda pada saat rilis diberi tag.

Agustí Sánchez
sumber
2
.INI .conf dan .txt biasanya tidak memiliki fitur build.
rjt
Tetapi Anda dapat meretas skrip rilis yang mengambil tag Git saat ini dan menulisnya ke sebuah file, atau semacamnya.
Marnen Laibow-Koser
1

Nama tag dan informasi terkait lainnya sekarang dapat diedit langsung ke dalam file secara otomatis oleh Git melalui export-substfitur gitattributes(5). Ini tentu saja membutuhkan penggunaan git archiveuntuk membuat rilis, dan hanya dalam file tar yang dihasilkan hasil edit substitusi akan terlihat.

Misalnya di .gitattributesfile letakkan baris berikut:

* export-subst

Kemudian di file sumber Anda dapat menambahkan baris seperti ini:

#ident  "@(#)PROJECTNAME:FILENAME:$Format:%D:%ci:%cN:%h$"

Dan itu akan meluas hingga terlihat seperti ini dalam rilis yang dibuat oleh, misalnya git archive v1.2.0.90,:

#ident  "@(#)PROJECTNAME:FILENAME:HEAD -> master, tag: v1.2.0.90:2020-04-03 18:40:44 -0700:Greg A. Woods:e48f949"
Greg A. Woods
sumber
0

Karena Anda menggunakan Emacs, Anda mungkin beruntung :)

Saya telah menemukan pertanyaan ini secara kebetulan, dan juga secara kebetulan saya datang ke Lively beberapa hari yang lalu, sebuah paket Emacs yang memungkinkan adanya potongan-potongan Emacs Lisp yang hidup dalam dokumen Anda. Sejujurnya saya belum mencobanya, tetapi hal itu muncul di benak saya ketika membaca ini.

Amr Mostafa
sumber
0

Saya juga berasal dari SCCS, RCS, dan CVS ( %W% %G% %U%).

Saya memiliki tantangan serupa. Saya ingin tahu versi kode apa yang ada di sistem mana pun yang menjalankannya. Sistem mungkin atau mungkin tidak terhubung ke jaringan manapun. Sistem mungkin atau mungkin tidak menginstal Git. Sistem mungkin atau mungkin tidak menginstal repositori GitHub di dalamnya.

Saya menginginkan solusi yang sama untuk beberapa jenis kode (.sh, .go, .yml, .xml, dll). Saya ingin setiap orang yang tidak memiliki pengetahuan tentang Git atau GitHub dapat menjawab pertanyaan "Versi apa yang Anda jalankan?"

Jadi, saya menulis apa yang saya sebut pembungkus di sekitar beberapa perintah Git. Saya menggunakannya untuk menandai file dengan nomor versi dan beberapa informasi. Itu memecahkan tantangan saya. Ini dapat membantu Anda.

https://github.com/BradleyA/markit

git clone https://github.com/BradleyA/markit
cd markit
Bradley Allen
sumber
0

Untuk mengatasi masalah ini sendiri, saya membuat "retasan" kecil sebagai kait pasca-komit:

echo | tee --append *
git checkout *

Lebih detail didokumentasikan dalam posting ini di blog saya .

Richard Ostrochovský
sumber