別の可能なアプローチに注意したいのですが、これはgit
git-notes(1)を使用することであり、v 1.6.6以降に存在します(Self-Gitへの注意)(git
バージョン1.7.9.5 を使用しています)。
基本的に、私git svn
は線形履歴(標準レイアウトなし、ブランチなし、タグなし)でSVNリポジトリーを複製するために使用し、複製されたgit
リポジトリーのリビジョン番号を比較したいと考えました。このgitクローンにはデフォルトでタグがないため、を使用できませんgit describe
。ここでの戦略は、線形履歴に対してのみ機能する可能性があります-マージなどでどうなるかはわかりません。しかし、ここに基本的な戦略があります:
- 掲載
git rev-list
のすべてのリストの履歴をコミット
- 以来
rev-list
、「新しい順」にデフォルトである、我々は、その使用したい--reverse
最初の最も古い順にソートコミットのリストを取得するようにスイッチを
bash
シェルを使用して
- リビジョンカウンターとして各コミットのカウンター変数を増やし、
- コミットごとに「一時的な」git noteを生成して追加する
- 次に、
git log
with を使用してログを参照します。これにより--notes
、コミットのメモもダンプされます。この場合、「リビジョン番号」になります。
- 完了したら、一時的なメモを消去します(注:これらのメモがコミットされているかどうかはわかりません。実際には表示されません
git status
)
最初に、メモgit
のデフォルトの場所があることに注意しましょう。ただし、メモのref
(erence)を指定することもできます。これにより、の下の別のディレクトリに保存され.git
ます。たとえば、git
repoフォルダーにいる間は、を呼び出しgit notes get-ref
て、どのディレクトリになるかを確認できます。
$ git notes get-ref
refs/notes/commits
$ git notes --ref=whatever get-ref
refs/notes/whatever
注意する事は、あなたの場合ということであるnotes add
と--ref
そうでない場合はあなたのようなエラーが出ることがあり、「 - 、あなたはまた、その後再びその参照を使用する必要がありませノートは、オブジェクトXXXが見つかりません...」。
この例でref
は、ノートの「linrev」(線形リビジョンの場合)を呼び出すことを選択しました。これは、手順が既存のノートに干渉する可能性が低いことも意味します。私もこの--git-dir
スイッチを使用しています。git
初心者なので、理解に問題がありました:)
。「後で覚えておきたい」と思います。また、を使用--no-pager
するless
場合のの生成を抑制するためにも使用しgit log
ます。
したがって、リポジトリであるサブフォルダmyrepo_git
を含むディレクトリにいると しgit
ます。できること:
### 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.
したがって、少なくともブランチのない完全に線形の履歴の特定のケースでは、リビジョン番号はこのアプローチと一致しているように見えます-さらに、このアプローチではgit log
リビジョン範囲を使用しながら、正しいリビジョン番号を取得できるようです-YMMVただし、コンテキストは異なります...
これが誰かを助けることを願って、
乾杯!
編集:OK、ここでは少し簡単git
です、上記のループのエイリアスはsetlinrev
andと呼ばれunsetlinrev
ます。gitリポジトリフォルダーで次の操作を行います(厄介なbash
エスケープに注意してください。#16136745-セミコロンを含むGitエイリアスを追加するも参照してください):
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
...したがってgit setlinrev
、線形リビジョンノートを含むログを作成する前に、単純に呼び出すことができます。そしてgit unsetlinrev
完了したら、それらのメモを削除します。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 <<
シェルがこれらのエイリアスを完了するのにかかる時間は、リポジトリ履歴のサイズによって異なります。