Vorrei solo notare un altro possibile approccio - e cioè usando git
git-notes (1) , esistente dalla v 1.6.6 ( Note a Self - Git ) (Sto usandogit
versione 1.7.9.5).
Fondamentalmente, ero solito git svn
clonare un repository SVN con cronologia lineare (senza layout standard, senza rami, senza tag) e volevo confrontare i numeri di revisione nel git
repository clonato . Questo clone git non ha tag di default, quindi non posso usarlo git describe
. La strategia qui probabilmente funzionerebbe solo per la storia lineare - non sono sicuro di come andrebbe a finire con le fusioni ecc .; ma ecco la strategia di base:
- Richiedi l'
git rev-list
elenco di tutta la cronologia di commit
- Dal momento che
rev-list
è di default in "ordine cronologico inverso", useremmo il suo --reverse
interruttore per ottenere l'elenco dei commit ordinati per primi
- Usa
bash
shell per
- aumentare una variabile contatore per ogni commit come contatore di revisione,
- genera e aggiungi una nota git "temporanea" per ogni commit
- Quindi, sfogliare il registro usando
git log
con --notes
, che scaricherà anche una nota di commit, che in questo caso sarebbe il "numero di revisione"
- Al termine, cancella le note temporanee ( NB: non sono sicuro che queste note siano impegnate o meno; in realtà non vengono visualizzate
git status
)
Innanzitutto, notiamo che git
ha una posizione predefinita di note - ma puoi anche specificare un ref
(erence) per le note - che le memorizzerebbe in una directory diversa in .git
; ad esempio, mentre ci si trova in una git
cartella repo, è possibile chiamare git notes get-ref
per vedere quale directory sarà:
$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever
La cosa da notare è che se si notes add
utilizza un --ref
, è necessario anche utilizzare nuovamente quel riferimento, altrimenti si potrebbero ottenere errori come " Nessuna nota trovata per l'oggetto XXX ... ".
Per questo esempio, ho scelto di chiamare le ref
note "linrev" (per la revisione lineare); ciò significa anche che non è probabile che la procedura interferisca con le note già esistenti. Sto anche usando lo --git-dir
switch, dato che essendo un git
principiante, ho avuto qualche problema a capirlo - quindi mi piacerebbe "ricordare per dopo" :)
; e uso anche --no-pager
per sopprimere la generazione di less
quando si usa git log
.
Quindi, supponendo che ti trovi in una directory, con una sottocartella myrepo_git
che è un git
repository; si potrebbe fare:
### 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.
Quindi, almeno nel mio caso specifico di storia completamente lineare senza rami, i numeri di revisione sembrano corrispondere a questo approccio - e inoltre, sembra che questo approccio consentirà l'utilizzo git log
con intervalli di revisione, pur ottenendo i giusti numeri di revisione - YMMV con un contesto diverso, sebbene ...
Spero che questo aiuti qualcuno,
Salute!
EDIT: Ok, qui è un po 'più semplice, con git
alias per i loop sopra, chiamato setlinrev
e unsetlinrev
; quando sei nella cartella del tuo repository git, fai ( Nota la cattiva bash
fuga, vedi anche # 16136745 - Aggiungi un alias Git contenente un punto e virgola ):
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
... quindi puoi semplicemente invocare git setlinrev
prima di provare a fare il log che coinvolge note di revisione lineari; e git unsetlinrev
per eliminare quelle note quando hai finito; un esempio dall'interno della directory repository git:
$ 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 <<
Il tempo impiegato dalla shell per completare questi alias dipende dalla dimensione della cronologia del repository.