나는 다른 가능한 방법을 참고하는 것처럼 - 그것은 사용하는 것입니다 git
자식 노트 (1) V 1.6.6 (이후 존재, 자기에 주 - 힘내 ) (내가 사용 git
버전 1.7.9.5 참조).
기본적으로 git svn
선형 히스토리 (표준 레이아웃, 브랜치, 태그 없음)를 사용 하여 SVN 저장소를 복제하고 복제 된 git
저장소 에서 개정 번호를 비교하려고했습니다 . 이 git clone에는 기본적으로 태그가 없으므로 사용할 수 없습니다 git describe
. 여기서 전략은 선형 이력에만 효과적 일 것입니다-병합 등으로 어떻게 될지 확실하지 않습니다. 그러나 기본 전략은 다음과 같습니다.
git rev-list
모든 커밋 히스토리 목록
요청
rev-list
기본적으로 "역순으로"역순 이므로 --reverse
스위치를 사용하여 가장 오래된 항목으로 정렬 된 커밋 목록을 가져옵니다.
bash
쉘을 사용 하여
- 각 커밋마다 카운터 카운터를 개정 카운터로 늘리십시오.
- 각 커밋마다 "임시"자식 메모 생성 및 추가
- 그런 다음
git log
with 을 사용하여 로그를 찾아보십시오. --notes
이 경우 커밋 노트도 덤프됩니다.이 경우 "개정 번호"가됩니다.
- 완료되면 임시 메모를 삭제합니다 ( NB :이 메모가 커밋되었는지 확실하지 않습니다. 실제로 표시되지 않음
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 그러나 다른 맥락에서 ...
이것이 누군가를 돕기를 바랍니다,
건배!
편집 : 좋아, 여기 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 <<
쉘이 이러한 별명을 완료하는 데 걸리는 시간은 저장소 히스토리의 크기에 따라 다릅니다.