2011-04-18 3 views
7

나는 원래의 나무를 그대로 보존하고 싶은 역사를 다시 쓰고있다. 다시 작성된 트리는 이전에 사용 된 태그도 복사해야합니다. 예를 들어 수동 옵션보다 적은 수의 옵션이 있습니다. 분기 이름 앞에 태그 이름을 추가합니까?git : 분기 별 태그와 같은 것이 있습니까?

답변

14

아니요, git에는 분기 별 태그와 같은 것이 없습니다. 모든 가지와 꼬리표는 망할 놈의 심판의 일종입니다. 심판은 개정 내역의 특정 개정판을 가리키는 이름입니다. 당신이 develmaster 지점 및 v1.0v2.0 태그가있는 경우 예를 들어, 참조는 다음과 같이 보일 것이다 :

 
refs/heads/devel -> * 
        /\ 
        * * <- refs/heads/master 
        | | 
        * * 
        \/
        * <- refs/tags/v2.0 
        | 
        * 
        | 
        * <- refs/tags/v1.0 
        | 
        * 

당신이 볼 수 있듯이, 어떤 지점에 해당 태그 동점 아무것도 없다을; 실제로 이러한 태그는 모두 masterdevel 브랜치에 포함되어 있습니다. .git 레포 내부를 살펴보면 태그보다 구조가 더 이상 존재하지 않음을 알 수 있습니다. .git/refs 내의 커밋을 참조하는 SHA-1 또는 .git/packed-refs의 줄을 포함하는 파일 일뿐입니다 (자주 변경되지 않으므로 태그는 에 자주 포함되며 분기는 일반적으로 git/refs 내의 개별 파일입니다).

따라서 기록을 다시 쓰고 오래된 태그를 보존하려면 태그 이름을 다시 써야합니다. sehe가 지적한대로이 작업은 git filter-branch --tag-name-filter을 사용하여 수행됩니다.

당신은 (가지)에 태그를 원하는 지점의 이름을 딴 디렉토리에 태그를 네임 스페이스 수
+2

... 'git filter-branch ..... '로 끝났습니다. - 태그 이름 필터 고양이' – sehe

+0

@sehe : 감사합니다.이 스크립트는 [이 스크립트]의 개선을 상기시켜줍니다. (http://stackoverflow.com/questions/4278264/git -split-history-of-some-files-of-separate-branch/4283970 # 4283970) –

1

가 속한하고 수동 될 필요가 없습니다 : 다음입니다

git-thisBranch() { git symbolic-ref --short HEAD; } 
git-localTag() { 
    local name="$1"; shift; 
    git tag $(git-thisBranch)/"$name" "[email protected]"; 
} 
관련 문제