2012-04-04 2 views
3

두 개발자가 각각 트렁크에서 기능 분기를 만드는 경우 트렁크뿐만 아니라 기능 분기간에 "동기화 병합"을 수행 한 다음 각 기능 분기를 문제없이 트렁크로 다시 통합 할 수 있습니까?SVN에서 지형지 물을 서로 병합하는 것이 안전합니까?

"동기화 병합"은 "svn merge ^/Project1/trunk"및 "svn merge ^/Project1/branches/other-feature-branch"형식의 명령을 의미합니다. 여기서 svn : mergeinfo 속성은 추적 할 것입니다 이미 각 위치에서 병합 된 항목 중

내가 물어 본 이유는 여러 지점에서 설명서를 읽었 기 때문에 지점에 동일한 수정 버전으로 다시 병합하면 충돌 문제가 발생할 수 있음을 알 수 있습니다.). 그렇다면 위에서 설명한 시나리오는 각 기능 분기가 트렁크뿐만 아니라 다른 기능 분기와 동기화되기 때문에 문제가됩니다. 따라서 트렁크에서 직접 변경 한 내용은 트렁크와 직접 동기화하거나 다른 기능 지점 (이미 동일한 트렁크가 변경되었을 수 있음).

그러나 테스트를 완료 한 결과이 작업은 완벽하게 잘 수행 된 것으로 보이지만 전문가 팀의 워크 플로우로이 작업을 권장하기 전에 전문가의 확신이 필요합니다.

@nosid : SO에 대한 우스운 글자 수 제한으로 인해 4 문장의 주석이 없으므로이 편집에서 nosid에 답장하십시오. 이 트위터 란 무엇입니까?

설명서를 읽었습니다. 문제는 한 번에 하나의 불안정한 기능 만 작동하고 다른 모든 작업은 트렁크에서 수행되는 동안 불안정한 작업이 기능 지점에서 수행되는 매우 간단한 시나리오를 설명한다는 것입니다. 이 시나리오에서는 기능 지점을 트렁크와 동기화 된 상태로 유지하는 것이 간단합니다.

그러나 현실적인 시나리오에서 제품은 여러 가지 주요 불안정한 작업을 즉시 수행 할 수 있습니다. 그런 다음 트렁크 및 서로간에 필요에 따라 동기화 할 수있는 방식으로 이러한 작업 조각을 동기화하는 프로세스는 무엇입니까?

+0

동시에 여러 개의 지형지 물을 가질 수 있습니다. 그건 아무 문제 없어요. 오버랩이 작은 한 각 분기의 변경 사항도 매우 클 수 있습니다. 오버랩이 거대한 경우에는 작동하지 않지만 _cross-merging_ 대신 피하려고합니다. – nosid

답변

0

두 지형지 물을 서로 동기화하는 경우 두 가지 지 점은 무엇입니까?

그들은 본질적으로 동일합니다.

+1

차이점은 다른 개발자가 체크인 할 때 강제로 기능을 사용하지 않고 원하는 때에 기능을 가져올 수 있다는 것입니다. – gbanfill

+0

따라서 수동으로 끌어 당깁니다 (언급 한대로 계속 병합하지는 않음)? –

+0

원하는 작업 흐름은 gbanfill 상태입니다. 나는 "지속적으로 병합"에 대해서는 언급하지 않았다. – Neutrino

4

이것은 방법이 아니며 Subversion에서 기능 분기를 사용해야합니다. 간단한 예제를 사용한 테스트에서이 접근법으로 인해 나중에 문제가 발생한다는 것을 알 수 있습니다. 다음 단계를 시도하십시오.

  • 새 저장소를 만듭니다.
  • 초기 구조 (트렁크, 분기, 태그)를 만들고 커밋하십시오.
  • svn cp -m 'new branch' ^/trunk ^/branches/a^/branches/b에 해당하는 명령을 사용하여 (빈) 트렁크의 두 가지 새 분기를 만들고 커밋하십시오.
  • b 지점에 새 파일을 추가하고 커밋하십시오.
  • b 지점의 변경 사항을 a 지점과 svn merge ^/branches/b으로 병합하십시오. 트렁크를 변경하지 않았으므로 병합 할 것이 없습니다.
  • 트렁크에 으로 브랜치를 다시 통합하고 커밋하십시오 (a).
  • 트렁크의 변경 내용을 b 지점에 svn merge ^/trunk으로 병합하십시오.
  • 이제는 이전에 추가 한 파일에 트리 충돌이 표시됩니다.

Subversion의 설명서에는 기능 분기의 권장 사용법이 자세히 설명되어 있습니다. Feature Branches 링크를 참조하십시오. 기능 분기는 일반적으로 트렁크에서 생성됩니다. 지사 지점을 직접 변경하고 트렁크의 변경 사항을 기능 지사 (svn merge ^/trunk)에 계속 병합합니다. 그리고 작업을 끝내 자마자 브랜치를 트렁크에 다시 통합하십시오 (svn merge --reintegrate ^/branches/name 포함). 다시 통합 된 후에는 지형지 물이 더 이상 사용되지 않아야합니다.

+0

네, 그게 실제로 실망입니다. 테스트가 너무 단순했기 때문에 새로운 파일을 추가하는 것보다 기존 파일의 변경 사항을 테스트하는 것이 었습니다. – Neutrino

+0

SVN 1.8부터 --reintegrate 스위치는 더 이상 필요하지 않습니다. 당신은 보통 병합을하고 SVN은 트리 충돌을 일으키지 않기 위해 필요한 모든 마법을 처리합니다. 여기를보세요 : http://stackoverflow.com/questions/18444634/tortoisesvn-subversion-1-8-merge-no-more-reintegrate-a-branch-option –

0

여기 OP의 질문에 대한 답변입니다. 질문에 대한 대답을 결정하기 위해 다른 출처에서 제안한 테스트 단계와 유사한 점을 발견 할 수 있지만 다른 결론이 있습니다. 마지막 (SVN 상태) 명령로부터 출력이 없습니다

#---------------------------------------------------------------------- 
# Test whether merging between feature branches in SVN results in 
# tree conflicts, as claimed elsewhere: 
# http://stackoverflow.com/questions/10015249 
#---------------------------------------------------------------------- 
export REPO=file:///tmp/merge-test/repo 

#---------------------------------------------------------------------- 
# Create a new repository. 
#---------------------------------------------------------------------- 
echo Creating a new repository ... 
cd /tmp 
rm -rf merge-test 
mkdir merge-test 
cd merge-test 
svnadmin create repo 

#---------------------------------------------------------------------- 
# Create and commit the initial structure (trunk, branches, tags). 
#---------------------------------------------------------------------- 
echo Creating initial structure ... 
svn mkdir $REPO/trunk -m "Initializing trunk" 
svn mkdir $REPO/branches -m "Initializing branches" 
svn mkdir $REPO/tags -m "Initializing tags" 

#---------------------------------------------------------------------- 
# Create and commit two new branches of the (empty) trunk. 
#---------------------------------------------------------------------- 
echo Creating two new branches of the empty trunk ... 
svn cp $REPO/trunk $REPO/branches/a -m "branch a" 
svn cp $REPO/trunk $REPO/branches/b -m "branch b" 
svn co $REPO/trunk 
svn co $REPO/branches/a 
svn co $REPO/branches/b 

#---------------------------------------------------------------------- 
# Add and commit a new file on branch b. 
#---------------------------------------------------------------------- 
echo Adding and committing a new file on branch b ... 
cd b 
echo testing > foo 
svn add foo 
svn ci -m "committing new file" 

#---------------------------------------------------------------------- 
# Merge the changes from branch b to branch a. 
#---------------------------------------------------------------------- 
echo Merging the changes from branch b to branch a ... 
cd ../a 
svn merge ^/branches/b 
svn commit -m "merged b into a" 

#---------------------------------------------------------------------- 
# Reintegrate and commit branch a on the trunk. 
#---------------------------------------------------------------------- 
echo Reintegrating and committing branch a back to the trunk ... 
cd ../trunk 
svn merge --reintegrate ^/branches/a 
svn ci -m "merged a back into trunk" 

#---------------------------------------------------------------------- 
# Merge the changes from the trunk to branch b. 
#---------------------------------------------------------------------- 
echo Merging the changes from the trunk to branch b ... 
cd ../b 
svn up 
svn merge ^/trunk 
svn ci -m "refreshing b from trunk" 

#---------------------------------------------------------------------- 
# Look for a tree conflict on the file added earlier. 
#---------------------------------------------------------------------- 
echo Looking for tree conflicts for the file added earlier ... 
svn status 

아마도 더 트리 충돌이 없음을 의미합니다 :

여기 내 생식 스크립트입니다. 내가 알 수있는 한, 분기 간 병합으로 인해 분기와 트렁크의 병합을 포함하여 병합이 발생할 수있는 정상적인 충돌을 넘어서는 문제가 발생할 것이라는 명확한 진술이 http://svnbook.red-bean.com/입니다. 크로스 - 브랜치 병합이 일반적으로 병합보다 문제가 있다는 증거가 있다면 그 증거를 조사하는 데 매우 흥미가있을 것입니다. 그때까지, 나는 영업에서 본질적으로 위험한 것이 아무것도 없다고 영업 사원에게 조언하고자합니다.

+0

이것은 매우 이상합니다. 내가 한 줄씩 당신의 예제를 통해 작업하고 단계에서 트리 충돌을 얻었습니다 "트렁크에서 분기 b로 병합"svn 출력은 "svn merge ^^/trunk --- r8에서 r8을 '.' : C foo.txt의 U ---에 R8을 통해 R5의 병합 mergeinfo를 기록. '.': G 충돌의 요약 :. 트리 충돌 : 1 "그건 SVN 버전의 내가 아는 1.7.8 – Neutrino

+0

그 svn 1.7 지금은 몇 가지 버전이지만 1.9로 업그레이 드하는 모든 시도는 1.7 서버에서 큰 저장소를 Windows에서 클라이언트 예외와 함께 실패하기 때문에, 나는 우리가 서버를 업그레이 드하기 전까지 1.7 빨아 빠졌어. – Neutrino

관련 문제