Я просто хотів би відзначити інший можливий підхід - а це за допомогою git
git-notes (1) , що існує з версії 1.6.6 ( Note to Self-Git ) (я використовую git
версію 1.7.9.5).
В основному я git svn
клонував git
сховище SVN з лінійною історією (без стандартного макета, без гілок, без тегів), і хотів порівняти номери ревізій у клонованому сховищі. Цей клон git не містить тегів за замовчуванням, тому я не можу його використовувати git describe
. Тут стратегія, ймовірно, працювала б лише для лінійної історії - не впевнена, як це вийде зі злиттями тощо; але ось основна стратегія:
- Попросіть
git rev-list
список усіх історій фіксації
- Оскільки
rev-list
за замовчуванням є "зворотний хронологічний порядок", ми використовуємо його --reverse
перемикач, щоб отримати список комітетів, відсортований спочатку за найстарішими
- Використовуйте
bash
оболонку для
- збільшити змінну лічильника на кожен комісій як лічильник перегляду,
- генерувати та додавати "тимчасову" примітку до git для кожного комітету
- Потім, переглядати журнал за допомогою
git log
з --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
a --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 з іншим контекстом, хоча ...
Сподіваюся, це допоможе комусь,
ура!
EDIT: Гаразд, тут трохи простіше, git
псевдоніми для вищезгаданих циклів називаються setlinrev
і 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 <<
Час, який знадобиться оболонці для завершення цих псевдонімів, залежатиме від розміру історії сховища.