2011-04-08 7 views
8

git-svn dcommit에 문제가있어서 git 리포지토리가 커밋을 추적하지 못합니다.Git-Svn dcommit이 브랜치 분할을 발생시킵니다.

나는 git의 master 브랜치가 항상 SVN 저장소의 트렁크를 따르는 지 확인하려고한다. 그래서 내가 일할 때마다 나는 주제 분야에있다.

내가 여기까지

git checkout master 
git svn rebase #get any changes in svn 
git rebase master my-topic 
git merge my-topic --ff-only 

을 마스터 다시 내 지점을 병합하고 싶습니다 결정

git checkout -b my-topic 
git commit -m "blah blah blah" 

그리고 잠시 동안 토픽 브랜치에서 작업, 모든 : 여기 내 시나리오입니다 잘 지냈어 요. 지금은 마스터와 속도 커밋 같은 가리키는까지 내 주제를 모두 가지고 있고, 전체 역사는 다음과 같습니다

A -- B -- C - master + my-topic 

을 그러나, 나는

git svn dcommit 

내가 끝낼 할 때 이처럼 보이는 나무 (B와 C가 커밋 내가 원래 주제로 만들어진) :

그것은 dcommit 과정처럼 보인다
-- B -- C - my-topic 
/
A -- B -- C - master + remotes/trunk 

가, 자식이 SVN까지 커밋을 밀어 다음 위에 그들을 다시 재생합니다 석사. 내가 생각하는 문제는 다른 커미터 정보를 얻는다는 것이다. 난 거북이 plink와 SSH 키로 svn에 로그인하고 있습니다. SVN 저장소에 밀려 한

Collin Hockey <[email protected]> 

커밋 그래도이 있습니다 :

chockey <[email protected]> 

이있는 한 SVN에 밀어되지 않은 자식 저장소에

커밋은 커미터 정보가 내가이 가지들을 나누어 줄 수있는 어떤 방법이라도?

git rebase master my-topic 

다시 한번 말하면 고칠 수 있지만 그럴 필요는 없다고 생각합니다. 이것의 주된 문제점은 일단 브랜치의 변경 사항이 SVN에 푸시되면 git은 그 브랜치가 어디서나 병합되었다고 생각하지 않는다는 것입니다. 더 이상 필요없는 이전 브랜치를 삭제하는 것은 혼란 스럽습니다.

답변

10

git svn dcommit 명령 일을 저지른 가리키는 :

  1. 찾기 SVN에서 오는 마지막 커밋; 의는 last-svn
  2. 가 SVN에서 HEAD
  3. last-svn으로 업데이트를 재설정하고 해당이
을 범 생성 (그런데 전자 메일을 폐기) last-svn..HEAD 파괴의 범위에있는 커밋을 보내기를 부르 자

즉, SVN에 보낸 커밋은 파괴되어 SVN의 업데이트에서 다시 작성됩니다. SVN에서 온 커밋 힘내으로 만든 것과 다르기 때문에이 문제가 발생할해야합니다

  • 그들의 설명을
  • 그들의 저자의 전자 메일이 SVN 사용자 이름에서 계산 된 SVN 개정에 대한 참조를 포함

귀하의 지점 my-topicmaster에서 분기하는 이유입니다.

--authors-file--authors-prog 옵션을 사용하여 git svn dcommit이 SVN 사용자 이름에서 작성자 전자 메일을 계산하는 방식을 사용자 정의 할 수 있습니다.

+1

조금 더 잘 작동하는 것처럼 보이지만 커밋은 여전히 ​​다릅니다 (다른 시간도 있습니다). 실제로 새로운 커밋이되지 않도록 (또는 두 브랜치에서 커밋을 자동으로 업데이트하는) 방법이 있습니까? 아니면 git-svn 브리지를 사용하는 것입니다. – Collin

+2

@Collin git-svn이 작동하는 방식입니다. SVN이 커밋을 제공하고 Git이이를 충실하게 반영합니다. 이 동작을 변경할 수있는 방법은 없습니다 (물론 Git-SVN 동기화 도구를 직접 작성하는 경우 제외). –

+1

정보를 제공해 주셔서 감사합니다. 나는 dcommit-ing 후에 내 브랜치를 rebase하는 것에 만 충실 할 것이다. 저자 파일은 내 역사를 훨씬 더 예쁘게 만듭니다. :) – Collin

3

당신이 옳다면, 그 명령은 svn에서 다시 커밋을 재생합니다. git의 브랜치는 커밋 (또는 이미 존재하는/해시)에 대한 포인터 일뿐입니다.SVN에서 커밋 다른 해시를해야합니다, 만 현재 체크 아웃 지점은 git svn dcommit으로 업데이트됩니다, 그래서 당신의 주제 지점은 여전히 ​​다음과 같이 오래된

관련 문제