Ich möchte nur einen anderen möglichen Ansatz erwähnen - und zwar unter Verwendung von git
Git-Notes (1) , die seit Version 1.6.6 ( Note to Self - Git ) existieren (ich verwende git
Version 1.7.9.5).
Grundsätzlich habe ich git svn
ein SVN-Repository mit linearem Verlauf geklont (kein Standardlayout, keine Verzweigungen, keine Tags) und wollte die Revisionsnummern im geklonten git
Repository vergleichen. Dieser Git-Klon hat standardmäßig keine Tags, daher kann ich ihn nicht verwenden git describe
. Die Strategie hier würde wahrscheinlich nur für die lineare Historie funktionieren - nicht sicher, wie sie sich bei Zusammenführungen usw. entwickeln würde; aber hier ist die grundlegende Strategie:
- Fragen Sie
git rev-list
nach einer Liste aller Commit-Historien
- Da dies
rev-list
standardmäßig in "umgekehrter chronologischer Reihenfolge" erfolgt, verwenden wir den --reverse
Schalter, um eine Liste der Commits zu erhalten, die zuerst nach den ältesten sortiert sind
- Verwenden Sie
bash
Shell, um
- Erhöhen Sie eine Zählervariable bei jedem Commit als Revisionszähler.
- Generieren und fügen Sie für jedes Commit eine "temporäre" Git-Notiz hinzu
- Durchsuchen Sie dann das Protokoll mit
git log
with --notes
, wodurch auch die Notiz eines Commits ausgegeben wird, in diesem Fall die "Revisionsnummer".
- Wenn Sie fertig sind, löschen Sie die temporären Notizen ( Hinweis: Ich bin nicht sicher, ob diese Notizen festgeschrieben sind oder nicht; sie werden nicht wirklich angezeigt
git status
).
Beachten Sie zunächst, dass git
Notizen einen Standardspeicherort haben. Sie können jedoch auch einen ref
(Erence) für Notizen angeben , der sie in einem anderen Verzeichnis unter speichert .git
. In einem git
Repo-Ordner können Sie beispielsweise anrufen, um git notes get-ref
zu sehen, welches Verzeichnis dies sein wird:
$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever
Zu beachten ist, dass Sie, wenn Sie notes add
mit a arbeiten --ref
, diese Referenz auch danach erneut verwenden müssen. Andernfalls werden möglicherweise Fehler wie " Keine Notiz für Objekt XXX gefunden ... " angezeigt .
In diesem Beispiel habe ich beschlossen, ref
die Notizen "linrev" (für lineare Überarbeitung) zu nennen. Dies bedeutet auch, dass es unwahrscheinlich ist, dass die Prozedur bereits vorhandene Notizen stört. Ich benutze den --git-dir
Schalter auch, da ich als git
Neuling einige Probleme hatte, ihn zu verstehen - also möchte ich mich "für später erinnern" :)
; und ich benutze auch --no-pager
zur Unterdrückung Laichen von less
bei der Verwendung git log
.
Angenommen, Sie befinden sich in einem Verzeichnis mit einem Unterordner, myrepo_git
der ein git
Repository ist. man könnte tun:
### 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.
Zumindest in meinem speziellen Fall einer vollständig linearen Historie ohne Verzweigungen scheinen die Revisionsnummern mit diesem Ansatz git log
übereinzustimmen - und außerdem scheint es, dass dieser Ansatz die Verwendung mit Revisionsbereichen ermöglicht, während immer noch die richtigen Revisionsnummern erhalten werden - YMMV mit einem anderen Kontext, obwohl ...
Hoffe das hilft jemandem,
Prost!
EDIT: Ok, hier ist es ein bisschen einfacher, mit git
Aliasnamen für die obigen Schleifen, genannt setlinrev
und unsetlinrev
; Wenn Sie sich in Ihrem Git-Repository-Ordner befinden, tun Siebash
dies ( Beachten Sie das böse Entkommen, siehe auch # 16136745 - Hinzufügen eines Git-Alias mit einem Semikolon ):
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
... damit Sie einfach aufrufen können, git setlinrev
bevor Sie versuchen, ein Protokoll mit linearen Revisionsnotizen zu erstellen; und git unsetlinrev
diese Notizen zu löschen, wenn Sie fertig sind; Ein Beispiel aus dem Git-Repo-Verzeichnis:
$ 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 <<
Die Zeit, die die Shell benötigt, um diese Aliase zu vervollständigen, hängt von der Größe des Repository-Verlaufs ab.