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 gitVersion 1.7.9.5).
Grundsätzlich habe ich git svnein SVN-Repository mit linearem Verlauf geklont (kein Standardlayout, keine Verzweigungen, keine Tags) und wollte die Revisionsnummern im geklonten gitRepository 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-listnach einer Liste aller Commit-Historien
- Da dies
rev-liststandardmäßig in "umgekehrter chronologischer Reihenfolge" erfolgt, verwenden wir den --reverseSchalter, um eine Liste der Commits zu erhalten, die zuerst nach den ältesten sortiert sind
- Verwenden Sie
bashShell, 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 logwith --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 gitNotizen 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 gitRepo-Ordner können Sie beispielsweise anrufen, um git notes get-refzu 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 addmit 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, refdie 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-dirSchalter auch, da ich als gitNeuling einige Probleme hatte, ihn zu verstehen - also möchte ich mich "für später erinnern" :); und ich benutze auch --no-pagerzur Unterdrückung Laichen von lessbei der Verwendung git log.
Angenommen, Sie befinden sich in einem Verzeichnis mit einem Unterordner, myrepo_gitder ein gitRepository 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 gitAliasnamen für die obigen Schleifen, genannt setlinrevund 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 setlinrevbevor Sie versuchen, ein Protokoll mit linearen Revisionsnotizen zu erstellen; und git unsetlinrevdiese 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.