나도 Subversion이 브랜치를 병합하지 못하고 Mercurial (및 Git, Bazaar 등)이 옳은 일을하는 경우를 찾고 있습니다.
SVN Book 은 이름이 바뀐 파일이 어떻게 잘못 병합 되는지 설명합니다 . 이것은 Subversion 1.5 , 1.6 , 1.7 및 1.8에 적용됩니다 ! 아래 상황을 재현하려고했습니다.
CD / tmp
RM - RF SVN - REPO SVN - 체크 아웃
svnadmin svn 만들기 - 저장소
svn 체크 아웃 파일 : /// tmp / svn - repo svn - checkout
CD SVN - 체크 아웃
mkdir 트렁크 브랜치
에코 '안녕, 세상!' > 트렁크 / 안녕하세요 . txt
svn 트렁크 분기 추가
svn commit - m '초기 가져 오기.'
svn copy '^ / trunk' '^ / branches / rename' - m '분기 생성'
svn 스위치 '^ / trunk' .
에코 '안녕하세요, 세계!' > 안녕하세요 . txt
svn commit - m '트렁크에서 업데이트.'
svn 스위치 '^ / branches / rename' .
svn 이름을 hello로 바꿉니다 . txt hello . ko . txt
svn commit - m '브랜치 이름 바꾸기'
svn 스위치 '^ / trunk' .
SVN 병합 - 재 통합 '^ / 가지 / 이름 바꾸기'
이 책에 따르면, 병합은 깨끗하게 완료되지만 업데이트 trunk
가 잊혀진 이후 이름이 바뀐 파일에 잘못된 데이터가 있어야합니다 . 대신 트리 충돌이 발생합니다 (작성 당시 데비안의 최신 버전 인 Subversion 1.6.17과 관련이 있습니다).
--- 리포지토리 URL의 차이점을 '.'으로 병합 :
hello.en.txt
C hello.txt
충돌 요약 :
나무 갈등 : 1
전혀 충돌이 없어야합니다. 업데이트는 파일의 새 이름으로 병합되어야합니다. Subversion은 실패하지만 Mercurial은이를 올바르게 처리합니다.
rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge
병합하기 전에 저장소는 다음과 같습니다 (from hg glog
).
@ changeset : 2 : 6502899164cc
| 태그 : 팁
| 부모 : 0 : d08bcebadd9e
| 사용자 : Martin Geisler
| 날짜 : Thu Apr 01 12:29:19 2010 +0200
| 요약 : 이름을 바꿉니다.
|
| o 변경 세트 : 1 : 9d06fa155634
| / 사용자 : Martin Geisler
| 날짜 : Thu Apr 01 12:29:18 2010 +0200
| 요약 : 업데이트.
|
변경 세트 : 0 : d08bcebadd9e
사용자 : Martin Geisler
날짜 : Thu Apr 01 12:29:18 2010 +0200
요약 : 최초 수입.
병합 결과는 다음과 같습니다.
hello.en.txt와 hello.txt를 hello.en.txt에 병합
0 개 파일 업데이트, 1 개 파일 병합, 0 개 파일 제거, 0 개 파일 미해결
(분기 병합, 커밋하는 것을 잊지 마십시오)
즉, Mercurial은 개정 1에서 변경된 사항을 개정 2 ( hello.en.txt
) 의 새 파일 이름으로 병합했습니다 . 이 사건을 처리하는 것은 지원 리팩토링하기 위해 코스 필수적이며 리팩토링은 정확하게 당신이 지점에하고 싶은 것입니다 물건의 종류.