2010-06-29 8 views
12

OpenSource 프로젝트의 코드를 사용하는 프로젝트에서 작업하고 있습니다. 요구 사항 중 하나는 많은 양의 코드를 최대한 업스트림으로 푸시하는 것입니다.SVN 업스트림과의 동기화 작업

원격 프로젝트에서 Subversion을 사용하고 있습니다 (별로 좋지 않음).

내 현재 설정은 다음과 같습니다

[Remote SVN] (git svn fetch)-> [My public Git] <-(push/pull)-> [My dev. Git] 
            VV 
            (pull) 
            VV 
           [Testing grid] 

편집 11.7. - 질문 다시 형식화

내 문제는 내 로컬 공개 Repo와 svn 업스트림의 공존입니다.

나는 3 대중 가지 제공해야합니다 :

  • 보수적 인 안정
  • 실험 안정
  • 개발을

이러한 분기는 (개발되고 실험 안정적이고 실험적인 보수가된다) 이제 선형 , 그러나 목표는 병합이있는 표준 3 헤딩 방식입니다. 그들의 공공 성 때문에 나는이 지부들을 재 위조 할 수 없다.

이제 완전히 직각으로 이것을 업 스트림으로 쉽게 보낼 수 있도록 노력하고 있습니다. 내 지부에서 그들을 파내는 것은 느리고 오류가 발생하기 쉽습니다.

내 일반 전류 흐름은 다음과 같습니다

  • 최고 개발 분기에 일부 기능을 구현
  • 테스트 & 수정 기능
  • 테스트 &이 새로운 기능 (실제로 많이 발생)
  • 에 의해 깨진 다른 기능을 수정
  • 이것이 업스트림에서 허용 될 수 있는지 여부를 확인하십시오 (30:60 예 : 아니오)
  • 부를 따로 단지 서로 다른 지점에 패치에 동의 함을

상류의 또 다른 문제는) 새로운 TODO 쓰기 (내 공개 지사는) 자신의 안정적인 지점을 기준으로합니다. 패치가 안정된 브랜치에 도달하면 그 패치가 존재한다는 사실을 잊어 버릴 수 있지만, 그렇게 될 때까지는 여전히 로컬로 유지해야합니다.

+1

귀하의 작업은 다음과 유사합니다. http://hgbook.red-bean.com/read/advanced-uses-of-mercurial-queues.html. "Mercurial Queues"가 관리하는 패치 스택으로 해결되었습니다. git에 대한 그러한 유틸리티가 있는지 모르겠다 – Alsk

+0

@Alsk 이것은 실제로 비슷하게 보입니다. 팁 고마워. –

답변

28

git svn documentation은 다음과 워크 플로우를 권장합니다

# Clone a repo (like git clone): 
git svn clone http://svn.example.com/project -T trunk -b branches -t tags 

# Append svn:ignore settings to the default git exclude file: 
git svn show-ignore >> .git/info/exclude 

# View all branches and tags you have cloned: 
git branch -r 

# Create a new branch in SVN 
git svn branch waldo 

# Reset your master to waldo: 
git reset --hard remotes/waldo 

# local changes 
git add ... 
git commit ... 

# pull changes on current branch 
git svn rebase 

# send changes to Subversion 
git svn dcommit 

# check for new branches 
git svn fetch

위의 워크 플로우는 중단 당신이 커밋 약간의 사치를 누릴 수있는 단일 서브 분기에 변화하지만, 저글링 다수입니다 활성 Subversion과 git 브랜치는 조금 까다 롭습니다.

git checkout -b waldo-svn remotes/waldo

-svn 접미사로 시작, Subversion 저장소의 왈도 지점을 추적하는 것은

warning: refname 'waldo' is ambiguous.

형태의 경고를 방지하는 것입니다이 자식 지점이 있음을 알려 Subversion 브랜치 추적 용. 이러한 분기를 항상 선형으로 유지하십시오!

는 왈도-svn을 갱신이 서브 버전의 변경을 가져오고 그 위에 로컬 변경 사항을 리베이스됩니다

git svn rebase

실행합니다. 또한 로컬 변경 사항 중 하나가 업스트림에서 승인되면 충분히 인식됩니다. Subversion 커밋으로 대체되고 커밋 메시지에 git-svn-id: ...으로 시작하는 줄이 있습니다.인생은 재미 해결 갈등과를 얻을 때

상류 테이너가 (여러 서브 버전으로 패치가 커밋 분할, 코드를 수정하거나, 하나의 커밋에 여러 패치를 결합, 예를 들어) 내용과 패치의 구조를 변경

입니다 엉망진창을 풀다.

전체적으로 보아 -svn 분기를 git clean (변경하지 않음)으로 유지하고 -svn 분기에서 분기를 만듭니다. 그런 다음 git svn rebase는 서브 버전의 repo 잡을 때

git diff waldo-svn waldo-fix-frobnicator

를 사용하여 패치를 보내려면 로그를 검토하고 자식을 위해, 문제 지점의 각 처분에 종류의 GTD을 결정해야합니다 .

+3

+1 "당신의 svn 가지 깨끗하게". 그것들은 근본적으로 당신의 * svn 브랜치가 아니며 업스트림 브랜치이기 때문에 로컬 브랜치 저장소에 별도의 브랜치로 저장해야합니다. 그게 있으면, noq는 Git 업스트림 브랜치와 같은 방식으로 작업 할 수있다. –

+1

긴 답변을위한 Thx. 그러나 그것이 내가 문제가되는 부분이 아닙니다. 나는 질문을 다시 형식화했다. 잘하면 지금은 더 명확해질 것이다. –

+2

'-T trunk -b branches -t tags'의 더 쉬운 동의어는'-s'입니다. – l0b0

1

나는 당신의 문제를 이해하고 있는지 잘 모르겠다. 그러나 나는 당신이 git stash을 찾고있을 것이라고 생각한다.

+0

감사합니다. 조금만 도움이 될지 모르지만 전체 문제에 대한 해결책은 아닙니다. –

1

귀하의 기능이 업스트림 코드와 얼마나 잘 결합되어 있는지 확신 할 수 없지만 기능 추가와 별도로 유지 관리하는 업스트림의 "핵심"을 분기 할 수 있습니다. 이것은 코드베이스를 분할 할 수있는 경우에만 실제로 작동합니다.

+0

글쎄, 내가 코드를 파티션 않습니다. 이 코드에 대한 패치의 양 때문에 업스트림 버그 픽스가 중요하지 않기 때문에베이스에서 완전히 분리 된 코드의 일부분을 유지합니다. 문제는 나머지 코드입니다. –

0

당신이 정말로하고 싶은 것을 분명히하지 않았습니다. "(각 기능에 대한 별도의 지점을 유지하는 것은 그리 중요하지 않습니다.)"라는 진술과 관련하여 나는 왜 그것이 사소한 것이라고 생각하는지 궁금해 할 수 있습니다. 상호 의존적 인 두 개의 패치는 단일 패치이거나 적어도 하나의 단일 브랜치에 있어야합니다. A에 의존하는 패치 B (다른 방법은 아님)는 A가있는 브랜치 또는 A 브랜치에서 상위 커미트가있는 브랜치에 있어야합니다.

패치가 업스트림 인 지점에 대한 "명확한 개요"를 유지하려면 모든 업스트림 브랜치의 로컬 복사본을 보관할 수 있습니다. 나는 그 문제가 어디에 있는지 알지 못한다. 보다 정확한 답변을 원한다면 정말 정확해야합니다.


좋아, 지금 다루기가 쉽다.

두 가지 문제가 있습니다.

(1) 당신이 다시 보내지 않는다는 것을 알게되면, 당신은 주된 개발 브랜치의 결코 상류로 가지 않고 포크 브랜치로가는 포크 커밋을 얻고 있습니다.

분기 분기 만들기. 일단 기능이 돌아 가지 않는다는 것을 알게되면, 포크 기능을 가지고있는 지점에서 당깁니다. 그런 다음 git revert 포크 기능을 사용하여 local- *에서 기능을 취소하는 패치를 적용합니다. 필요에 따라 반복하십시오.

(2) 패치 업스트림에 어떤 문제가 있는지 걱정하고 있습니까?

아직 원격 안정 (r 안정적인)에 패치를 적용했는지 추적 할 필요가 없습니다. r-stable에서 추방하고 패치를 아직 적용하지 않은 경우 L-stable에서 패치를 잃지 않습니다. 가능한 유일한 문제는 패치의 코드에 병합 충돌이있을 수 있지만이를 해결할 수는 없을 것입니다. 일단 패치를 적용하면 병합 충돌을 해결 한 방법과 똑같이 보입니다 (이 경우 R-stable에서 패치를 가져올 때 차이점을 얻지 못합니다) 또는 다른 방법으로 병합합니다 , 당신은 합병 갈등을 겪을 것이고 길을 계속 지키기로 결정할 기회를 얻게 될 것입니다. 당신의 길을 계속 지키고 싶다면, 당신은 r-stable로부터 포크가 될 것이라는 것을 기억하십시오. 하나의 옵션은 "자신의 길"을 포크에 옮기고 로컬에 길을 유지하는 것입니다 *. 서브 가지를 처리 ​​할 때

+0

나는 다시 질문을 다시 정리했다. 다행히도 지금은 분명 할 것입니다. –

관련 문제