2009-05-28 2 views
8

저는 우리 cms (asp.net webforms에서 실행되는)를위한 새로운 관리 대시 보드를 작성하고 있습니다. 이전 서버 중 일부는 .NET 2.0을 여러 가지 이유로 처리 할 수 ​​있으므로 람다 식 등을 사용하는 코드를 다시 작성해야합니다.DVCS (제 경우에는 수은)를 사용하여 다른 버전의 .NET 프레임 워크를 개발 하시겠습니까?

나는 두 가지 버전을 동시에 개발하기 위해 수은 같은 dvcs를 어떻게 사용하는지 궁금합니다.

현재 코드베이스와 mercurial 저장소는 .NET 3.5를 대상으로합니다. 나는 상대적으로 수은에 익숙하지 않은데, 나는 코드베이스를 가지게 될 것이라고 생각한다.

모범 사례 또는 자습서는 무엇입니까?

답변

13

예, 여기에서는 Mercurial을 사용할 수 있습니다. 여기 그것이 작동하는 방법입니다.

현재 복제본이 new-dot-net이라면 은 새로운 .Net 버전을 지원하므로이 복제본을 new-dot-net이라고합니다. 당신은 그것의 클론을 만들고 그것을 old-dot-net 또는 이와 비슷한 것으로 부릅니다. 두 클론은 현재 과 같으며 대상은 .Net 3.5입니다.

이제 을 약간 변경하여 .Net 2.0 호환 가능하게 만드십시오. 당신이 변경하면 두 클론 분기가 시작됩니다 :

 
new-dot-net: ... [a] --- [b] 

old-dot-net: ... [a] --- [b] --- [c] --- [d] 

은 여기에서 닷넷 2.0 호환성을 추가 [c][d] 변경 집합을했다. old-dot-net 클론에 변경 집합이 포함되어있는 이유에 유의하십시오. 이전 버전과의 호환성이 이므로 은 변경되지 않습니다.new-dot-net으로 변경합니다. 계속하시는대로 작업을 계속하시는 것이 중요합니다. net-dot-net은 변경 집합의 하위 집합 old-dot-net에 포함될 것입니다. 변경 사항은 new-dot-net에서 old-dot-net으로 변경되지만 이 아닌은 반대 방향으로 변경됩니다.

new-dot-net에서 새롭게 변경한다고 가정 해 보겠습니다. 당신은 new-dot-net의 변화 을하고 상황은 지금과 같다 : 당신 변화 old-dot-net에,

 
new-dot-net: ... [a] --- [b] --- [x] 

old-dot-net: ... [a] --- [b] --- [c] --- [d] 

당신은 지금뿐만 아니라 old-dot-net에 변화를 포트를 백업 할 및 net-dot-net에서 끌어 :

% cd old-dot-net 
% hg pull ../new-dot-net 

 
          [x] 
          /
old-dot-net: ... [a] --- [b] --- [c] --- [d] 
:

이것은 new headold-dot-net에서 생성됩니다

[x] 변경 집합의 부모 변경 집합은 [b]이므로 이제 에 multiple heads이 있고 수를 줄이기 위해 병합해야합니다. 병합을하면 의 방식 인 새로운 changeset를 만들 수 있습니다. "[x][d]을 결합하는 방법"이라고 말합니다.[x] 변경 집합 만 터치하지 않은 코드 (예 : [c][d]) 만 병합하면 병합이 작동합니다. 그렇지 않으면 병합 도구로 이 표시되고 충돌을 해결해야합니다. 지금 닷넷 2.0 호환 코드로 [x] 변화를 통합 한 -

 
          [x] --------------. 
          /     \ 
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e] 

하면됩니다 : 당신은 chageset [e]로 병합을 커밋합니다.

new-dot-net에 변경 사항이있을 때마다 이것을 반복하십시오. 당신이

 
          [x] --------------.---- [y] --- [z] 
          /     \ 
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e] 

을 얻을 old-dot-net로 당겨 후

 
new-dot-net: ... [a] --- [b] --- [x] --- [y] --- [z] 

을 그리고 당신은 지금 [e][z] 병합 : 의 더 많은 기능이 추가한다고 가정 해 봅시다 기억

 
          [x] --------------.---- [y] --- [z] 
          /     \    \ 
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e] ----------- [f] 

중요한 부분을 다음과 같습니다 :

  • 새로운 기능new-dot-net으로 변경하십시오.
  • old-dot-net
  • 변화는 결코 new-dot-netold-dot-net에서을 밀어하지 않습니다.

당신이 어떤 점에서 new-dot-net에 변화가없는 old-dot-net 필요는 것을 발견 할 경우, 당신은 여전히 ​​ 에게 그것을 그것을 끌어와 병합 할 필요가있다. 그런 다음 더미 병합을 수행합니다. 헤드가 [w][g], 그리고 당신이 [g]을 유지하려면, 다음 다음 모든 변경 사항을 되돌리려면,

% HGMERGE=true hg merge -y 
% hg revert --all --rev g 
% hg commit -m 'Dummy merge with y.' 

trick이 결과에 대해 걱정하지 않고 병합을 수행하는 것입니다, 그리고로 변경되지 않은 작업 복사본을 커밋 병합 그렇게하면 세계에 "[w][g]의 조합은 [g]"입니다. 즉, 변경 사항을 [w]에 버립니다. 새 new-dot-net 이후에 변경된 내용이 [w] 인 경우 처럼 병합 할 수 있습니다.

+0

그래서이 지점을 사용하지 않으시겠습니까? 왜 안돼? – kitsune

+1

아무런 차이가 없습니다. Mercurial에서 (명명 된) 가지와 클론간에 1-1의 관계가 있습니다. 따라서 변경 사항을 뒤로 이식하는 것이 쉽지도 어렵지도 않습니다. 클론을 사용하면 두 개의 클론에서 파일을 비교하는 것이 더 쉬울 수 있으며 (편집기에서 파일을 열어서) 분리하면 위와 같이 쉽게 설명 할 수 있습니다. –

+0

감사합니다. – kitsune