Sadece başka bir olası yaklaşımı not etmek istiyorum - ve v- 1.6.6'dan beri var olan git
git-notes (1) kullanarak ( Self-Git'e Not ) ( git
1.7.9.5 sürümünü kullanıyorum).
Temel olarak, git svn
bir SVN deposunu doğrusal geçmişe sahip klonladım (standart düzen yok, dal yok, etiket yok) ve klonlanmış git
depodaki revizyon numaralarını karşılaştırmak istedim . Bu git klonu varsayılan olarak etiket içermiyor, bu yüzden kullanamıyorum git describe
. Buradaki strateji muhtemelen sadece doğrusal tarih için işe yarayacaktır - birleşme vb. İle nasıl sonuçlanacağından emin değil; ancak temel strateji şöyledir:
git rev-list
Tüm taahhüt geçmişinin listesini
isteyin
- Yana
rev-list
"ters kronolojik sırayla" varsayılan olarak, biz onun kullanmayı tercih --reverse
kaydedilmesini listesi önce en eski Öneriliyor almak için anahtarı
bash
Kabuğu
kullan
- revizyon sayacı olarak her taahhütte bir sayaç değişkenini artırmak,
- her taahhüt için bir "geçici" git notu oluşturun ve ekleyin
- Ardından, günlüğüne
git log
birlikte kullanarak gözatın --notes
, bu da bir taahhüt notu çıkarır ve bu durumda "revizyon numarası" olur.
- İşiniz bittiğinde geçici notları silin ( Not: Bu notların işlenip işlenmediğinden emin değilim; gerçekten gösterilmiyorlar
git status
)
İlk olarak, git
notların varsayılan konumunun bulunduğunu - ancak notlar için ref
(erence) de belirtebileceğinizi ve bunları altında farklı bir dizinde depolayacağınızı unutmayın .git
; örneğin, bir git
repo klasöründeyken git notes get-ref
hangi dizinin olacağını görmek için arayabilirsiniz :
$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever
Dikkat edilmesi gereken şey notes add
, a ile birlikte --ref
olursanız, daha sonra bu referansı tekrar kullanmanız gerekir - aksi takdirde " XXX nesnesi için not bulunamadı ... " gibi hatalar alabilirsiniz .
Bu örnekte, ref
"linrev" notlarını (doğrusal revizyon için) çağırmayı seçtim - bu aynı zamanda prosedürün zaten var olan notlara müdahale etmesinin muhtemel olmadığı anlamına gelir. Ben de --git-dir
anahtarı kullanıyorum, bir git
acemi olduğundan, bunu anlamakta bazı problemlerim vardı - bu yüzden "daha sonra hatırlamak" istiyorum :)
; ve ben de kullanmak --no-pager
yumurtlamasını bastırmak için less
kullanırken git log
.
Yani, bir dizin içinde olduğunuzu varsayarsak myrepo_git
, bir git
havuz olan bir alt klasör ile ; biri yapabilirdi:
### 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.
Yani, en azından şubesiz tam doğrusal geçmişimde, revizyon numaraları bu yaklaşımla eşleşiyor gibi görünüyor - ve ek olarak, bu yaklaşım git log
revizyon aralıklarıyla kullanılmaya izin verirken, hala doğru revizyon numaralarını almaya izin veriyor gibi görünüyor - YMMV farklı bir bağlamda ...
Umarım bu birine yardımcı olur,
Şerefe!
EDIT: Tamam, burada ve git
denilen yukarıdaki döngüler için takma adlarla , biraz daha kolaydır ; git depo klasörünüzdeyken yapın ( Kötü kaçışa dikkat edin , ayrıca bkz. # 16136745 - Noktalı virgül içeren Git takma adı ekleyin ):setlinrev
unsetlinrev
bash
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
... böylece git setlinrev
doğrusal revizyon notlarını içeren bir günlük yapmaya çalışmadan önce çağırabilirsiniz ; ve git unsetlinrev
işiniz bittiğinde bu notları silmek için; git repo dizini içinden bir örnek:
$ 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 <<
Kabuğun bu takma adları tamamlaması için gereken süre, depo geçmişinin büyüklüğüne bağlı olacaktır.