Saya hanya ingin mencatat pendekatan lain yang mungkin - dan itu adalah dengan menggunakan git
git-note (1) , yang ada sejak v 1.6.6 ( Note to Self - Git ) (Saya menggunakan git
versi 1.7.9.5).
Pada dasarnya, saya dulu git svn
mengkloning repositori SVN dengan histori linier (tanpa tata letak standar, tanpa cabang, tanpa tag), dan saya ingin membandingkan angka revisi di git
repositori yang dikloning . Klon git ini tidak memiliki tag secara default, jadi saya tidak bisa menggunakan git describe
. Strategi di sini kemungkinan hanya akan bekerja untuk sejarah linier - tidak yakin bagaimana hasilnya dengan penggabungan dll .; tapi inilah strategi dasarnya:
- Minta
git rev-list
daftar semua riwayat komit
- Karena
rev-list
secara default dalam "urutan kronologis terbalik", kami akan menggunakan --reverse
sakelar untuk mendapatkan daftar komit yang diurutkan berdasarkan yang terlama terlebih dahulu
- Gunakan
bash
shell untuk
- menambah variabel penghitung pada setiap komit sebagai penghitung revisi,
- menghasilkan dan menambahkan catatan git "sementara" untuk setiap komit
- Kemudian, isi log dengan menggunakan
git log
dengan --notes
, yang juga akan membuang catatan komit, yang dalam hal ini akan menjadi "nomor revisi"
- Setelah selesai, hapus catatan sementara ( NB: Saya tidak yakin apakah catatan ini dilakukan atau tidak; mereka tidak benar-benar muncul di
git status
)
Pertama, mari kita catat yang git
memiliki lokasi default catatan - tetapi Anda juga dapat menentukan ref
(erence) untuk catatan - yang akan menyimpannya di direktori berbeda di bawah .git
; misalnya, saat berada di git
folder repo, Anda dapat menelepon git notes get-ref
untuk melihat direktori apa yang akan:
$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever
Hal yang perlu diperhatikan adalah bahwa jika Anda notes add
dengan --ref
, Anda juga harus kemudian menggunakan referensi itu lagi - jika tidak, Anda mungkin mendapatkan kesalahan seperti " Tidak ditemukan catatan untuk objek XXX ... ".
Untuk contoh ini, saya telah memilih untuk memanggil ref
catatan "linrev" (untuk revisi linear) - ini juga berarti tidak mungkin prosedur akan mengganggu catatan yang sudah ada. Saya juga menggunakan --git-dir
saklar, karena menjadi git
pemula, saya memiliki beberapa masalah memahaminya - jadi saya ingin "mengingat nanti" :)
; dan saya juga gunakan --no-pager
untuk menekan pemijahan less
saat menggunakan git log
.
Jadi, dengan asumsi Anda berada di direktori, dengan subfolder myrepo_git
yang merupakan git
repositori; yang bisa dilakukan:
### check for already existing notes:
$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
### iterate through rev-list three, oldest first,
### create a cmdline adding a revision count as note to each revision
$ ix=0; for ih in $(git --git-dir=./myrepo_git/.git rev-list --reverse HEAD); do \
TCMD="git --git-dir=./myrepo_git/.git notes --ref linrev"; \
TCMD="$TCMD add $ih -m \"(r$((++ix)))\""; \
echo "$TCMD"; \
eval "$TCMD"; \
done
# git --git-dir=./myrepo_git/.git notes --ref linrev add 6886bbb7be18e63fc4be68ba41917b48f02e09d7 -m "(r1)"
# git --git-dir=./myrepo_git/.git notes --ref linrev add f34910dbeeee33a40806d29dd956062d6ab3ad97 -m "(r2)"
# ...
# git --git-dir=./myrepo_git/.git notes --ref linrev add 04051f98ece25cff67e62d13c548dacbee6c1e33 -m "(r15)"
### check status - adding notes seem to not affect it:
$ cd myrepo_git/
$ git status
# # On branch master
# nothing to commit (working directory clean)
$ cd ../
### check notes again:
$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# (r15)
### note is saved - now let's issue a `git log` command, using a format string and notes:
$ git --git-dir=./myrepo_git/.git --no-pager log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD
# 04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 << (r15)
# 77f3902: _user_: Sun Apr 21 18:29:00 2013 +0000: >>test message 14<< (r14)
# ...
# 6886bbb: _user_: Sun Apr 21 17:11:52 2013 +0000: >>initial test message 1<< (r1)
### test git log with range:
$ git --git-dir=./myrepo_git/.git --no-pager log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
# 04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 << (r15)
### erase notes - again must iterate through rev-list
$ ix=0; for ih in $(git --git-dir=./myrepo_git/.git rev-list --reverse HEAD); do \
TCMD="git --git-dir=./myrepo_git/.git notes --ref linrev"; \
TCMD="$TCMD remove $ih"; \
echo "$TCMD"; \
eval "$TCMD"; \
done
# git --git-dir=./myrepo_git/.git notes --ref linrev remove 6886bbb7be18e63fc4be68ba41917b48f02e09d7
# Removing note for object 6886bbb7be18e63fc4be68ba41917b48f02e09d7
# git --git-dir=./myrepo_git/.git notes --ref linrev remove f34910dbeeee33a40806d29dd956062d6ab3ad97
# Removing note for object f34910dbeeee33a40806d29dd956062d6ab3ad97
# ...
# git --git-dir=./myrepo_git/.git notes --ref linrev remove 04051f98ece25cff67e62d13c548dacbee6c1e33
# Removing note for object 04051f98ece25cff67e62d13c548dacbee6c1e33
### check notes again:
$ git --git-dir=./myrepo_git/.git notes show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
$ git --git-dir=./myrepo_git/.git notes --ref=linrev show
# error: No note found for object 04051f98ece25cff67e62d13c548dacbee6c1e33.
Jadi, setidaknya dalam kasus khusus saya tentang riwayat linear penuh tanpa cabang, angka revisi tampaknya cocok dengan pendekatan ini - dan tambahan, tampaknya pendekatan ini akan memungkinkan penggunaan git log
dengan rentang revisi, sambil tetap mendapatkan angka revisi yang tepat - YMMV dengan konteks yang berbeda, meskipun ...
Semoga ini bisa membantu seseorang,
Ceria!
EDIT: Ok, ini dia sedikit lebih mudah, dengan git
alias untuk loop di atas, dipanggil setlinrev
dan unsetlinrev
; ketika di folder repositori git Anda, lakukan ( Perhatikan bash
pelolosan jahat , lihat juga # 16136745 - Tambahkan alias Git yang mengandung tanda titik koma ):
cat >> .git/config <<"EOF"
[alias]
setlinrev = "!bash -c 'ix=0; for ih in $(git rev-list --reverse HEAD); do \n\
TCMD=\"git notes --ref linrev\"; \n\
TCMD=\"$TCMD add $ih -m \\\"(r\\$((++ix)))\\\"\"; \n\
#echo \"$TCMD\"; \n\
eval \"$TCMD\"; \n\
done; \n\
echo \"Linear revision notes are set.\" '"
unsetlinrev = "!bash -c 'ix=0; for ih in $(git rev-list --reverse HEAD); do \n\
TCMD=\"git notes --ref linrev\"; \n\
TCMD=\"$TCMD remove $ih\"; \n\
#echo \"$TCMD\"; \n\
eval \"$TCMD 2>/dev/null\"; \n\
done; \n\
echo \"Linear revision notes are unset.\" '"
EOF
... jadi Anda bisa memohon git setlinrev
sebelum mencoba melakukan log yang melibatkan catatan revisi linear; dan git unsetlinrev
untuk menghapus catatan itu setelah selesai; contoh dari dalam direktori git repo:
$ git log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 <<
$ git setlinrev
Linear revision notes are set.
$ git log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 << (r15)
$ git unsetlinrev
Linear revision notes are unset.
$ git log --notes=linrev --format=format:"%h: %an: %ad: >>%s<< %N" HEAD^..HEAD
04051f9: _user_: Sun Apr 21 18:29:02 2013 +0000: >>test message 15 <<
Waktu yang dibutuhkan shell untuk menyelesaikan alias ini, akan tergantung pada ukuran riwayat repositori.