2012-07-06 5 views
19

다음 명령을 사용하여 svn repo를 git에 복제하고 실행 한 후 일부 가짜 브랜치를 봅니다. SVN에서 생성git-svn clone | 가짜 브랜치

*(no branch) 
    master 
    remotes/abc-1.3.x 
    remotes/[email protected] 
    remotes/[email protected] 
    remotes/branch_test_script 
    remotes/tags/modules-1.2 
    remotes/tags/[email protected] 
    remotes/tags/[email protected] 
    remotes/tags/release-1.1 
    remotes/tags/[email protected] 
    remotes/tags/[email protected] 
    remotes/trunk 

실제 분기

git branch -a

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

은 ABC, branch_test_script 모듈과 분리 하였다. 누군가 ' [email protected]', ' [email protected]'... ' [email protected]'등이 무엇인지 이해할 수 있습니까?

이러한 허위 분기를 제거하려면 어떻게해야합니까?/그 의미는 무엇입니까?

감사합니다,
Gayathri

+0

나는이 이름이 어디에서 왔는지 발견하는데 어려움을 겪고있다.하지만 원래 만든 svn 브랜치 (또는 태그)에 의해 더 이상 참조되지 않는 SVN 커밋에서이 브랜치들이 생성 된 것처럼 보인다. Git에서 unreferenced 커밋과 비슷하지만 커밋의 분기 이름을 복구 할 수 있다는 점을 제외하고는. – fork0

+0

@ fork0 : 답장을 보내 주셔서 감사합니다. 하지만 난 분명히 unreferenced 커밋 svn에 존재할 수있는 방법에 관해서는 이해가 안 돼. 참조가 어떻게 손실 될 수 있습니까? 이것에 대한 생각을 나눌 수 있습니까? – crankparty

+0

잘 모르겠습니다. 어쩌면 SVN 저장소의 관리자가 결코 그들을 정리하지 않았을 것입니다 (또는 SVN은 전혀 능력이 없습니다). 나는 참조가 손실되었다고 말하는 것이 아니라 오히려 누군가가 역사의 이전 시점에서 커밋을 시작했다는 것을 의미하지 않았다. – fork0

답변

15

TL; DR :

git svn이 "@"를 생성 - 지점 (또는 태그가) 하위 디렉토리 생성 된 경우 지점 (또는 자식-SVN에 의해 ​​추적되지 않은 다른 디렉토리). 같은 이름을 가진 "일반"브랜치가 있지만 "@"접미사는 없습니다. "@"- 브랜치는 일반 브랜치의 분기점으로 만 존재합니다.


참고 : 이에 대한 패치를 제출했습니다. 이 설명의 편집 된 버전은 이제 새로운 섹션 "SVN 브랜치 처리"(Git 1.8.1 이후)의 공식 git svn 맨 페이지의 일부입니다.


서브 버전에서 브랜치와 태그는 디렉토리 트리의 단지 복사본입니다, 그래서 그것은 그 자체 지점 (또는 트렁크)있는 디렉토리에서 분기를 만들 수 (보통 낙담하지만) 가능합니다. 예를 들어,/trunk/foo를/branches/bar에 복사하는 대신/trunk ("하위 디렉토리 브랜치", 말하자면)를 복사하거나 트렁크/태그/브랜치 구조 외부에있는 디렉토리를 복사합니다 SVN에서 가능).

그러나 git에서는 분기가 항상 전체 Repo에 사용되고 하위 디렉토리는 존재하지 않습니다. 따라서 git svn은 해결 방법을 사용합니다. git-svn에 의해 브랜치로 추적되지 않는 디렉토리에서 복사 된 브랜치를 발견하면 새로운 히스토리가 작성됩니다. 예를 들어,/트렁크/foo는이 r1234에서/분기/줄에 복사 하위 디렉토리 지점의 경우, 생성됩니다

  • 새로운 자식이 번호가 있습니다주의 (뒤쪽에 r1233에서 각 SVN 개정 커밋 지점이 만들어지기 전의 마지막 개정). 이 커밋의 트리에는 분기 된 서브 디렉토리 만 포함됩니다. 따라서 r1233의 각 개정판에 대해 일반적으로 두 개의 git 커밋이 있습니다. 하나는 전체 트리 (git-svn이 trunk의 기록을 처리 할 때 생성됨)이고 다른 하나는 새로운 것입니다.
  • 위의 r1233에서 작성한 커밋을 poinst하는 "bar @ 1233"(분기 이름 @ 개정)이라는 더미 분기입니다.
  • 분기를 작성한 커밋 인 r1234에서 커밋. 이 커밋은 상위 (유일한) 조상으로 위의 분기를 갖습니다.
  • 두 번째 커밋을 가리키는 "bar"라는 분기.
  • 그런 식으로

이 하위 디렉토리 지점 표시 줄, 당신이 얻을 자식 두 가지

  • 줄 분기는
  • 줄에서 생성 된 저장소의 상태를 나타냅니다 1233, @, 어떤 지점을 나타냅니다

나는 왜이 더미 분기가 만들어 지는지 잘 모르겠습니다. 지점이 분기 된 개정판에 대한 정보를 나타내고 지점에 대한 완전한 기록을 보유한 것으로 생각됩니다. 이기구 전체 플래그 --no-follow-parent를 이용하여 스위치 오프 될 수 있음은


참고. 이 경우, 각 SVN 브랜치는 SVN 브랜치 디렉토리의 커밋과 함께 git 브랜치가된다. 각 브랜치는 나머지 히스토리와 연결되지 않을 것이며, 브랜치의 첫 번째 커밋에 해당하는 자체 루트 커밋을 갖게됩니다.

3

내가했다 내가 망할 놈의 repo에 내 SVN의 REPO를 복제도 같은 이상하게라는 지점.

는 (귀하의 경우 modules-1.2, abc-1.3.x, branch_test_scriptrelease-1.1에서) 예상 지점을 검토 한 후 나는 @revisionnumber 가지가 접두사 지점에서 저지른 것보다 아무것도없는 것으로 나타났습니다.

당신이 지점 abc-1.3.x에, 수동 개방 gitk을 그렇게하고 [email protected][email protected]은 해당 분기의 역사에 표시되는지 확인하려면

. 그렇다면 해당 분기를 삭제할 수 있습니다.

검색 할 분기가 많거나 커밋이 많으면이 작업이 약간 번거로울 수 있습니다.

자동 방법 : 당신을 위해 그것을 할 자식에게 물어

git branch -r --contains [email protected] 

는 에코 (또는 적어도 해야)

abc-1.3.x 
[email protected] 
[email protected] 

이이 포함되어 있기 때문에 안전하게 [email protected]을 삭제할 수 있음을 의미 in abc-1.3.x :

git branch -r -d [email protected] 

SVN의 선형 히스토리 때문에 물론 (더 새로운) 커밋 541512도 포함되어 있습니다.


사이드 노트 :
당신은 당신의 SVN 태그가 실제로 망할 놈의 태그와 기본 힘내 가지로 변환되지 않습니다 것을 눈치 챘을 것이다. 이것은 svn2git을 사용하여 SVN repo를 Git repo로 복제 할 수 있습니다.

+0

이 지점을 제거하는 방법은 무엇입니까? 커밋을 무시하고 브랜치를 생성하지 않기 위해 git에 전달할 수있는 매개 변수가 있습니까? – crankparty

+0

내가 쓴대로 : 브랜치는'git branch -r -d '를 사용하여 삭제할 수있다. 나는 가지가 만들어지지 않는다는 것을 성취 할 깃발이 있다고 생각하지 않는다. – eckes

+1

'git-svn'은 이러한 "@"브랜치를 불필요하게 만들지 만,'abc @ 113346'은'abc'의 ** ancestor가 아닌 중요한 경우가 있습니다. 서브 버전에서 분기가 삭제되고 다른 지점에서 복사하여 다시 작성한 경우에 발생합니다. 또한'abc @ 113346'가'abc'의 조상이라는 사실은 이것이 일어나지 않는다는 것을 의미하지는 않습니다.'abc'가 트렁크에 병합되고, 삭제되었습니다 (일부 개정에서는 113346 이상). 그리고 새로운 그것은 트렁크에서 그것의 장소에 만들어졌습니다. –