2011-12-16 3 views
11

우리는 최근에 우리 저장소에 디렉토리의 hg copy 디렉토리를 만들었습니다. 우리는 그것을 생각했다 cp -ahg add와 같은 무엇인가 어떻게 든 그것을 이 파일은 repo (그래서 hg annotate는 원래의 커미터를 보여준다)의 다른 파일에서 베껴졌다라고 생각했다. 그러나 이제는 hg copy이 그보다 더 많거나 다른 것들을하는 것처럼 보입니다. 나는 정확하게 정확히 어떻게 복사가되는지에 관해 많이 알지 못했다. . 그래서 :hg 복사는 무엇을합니까?

  • 정확히 hg copy는 무엇을 하는가와 어떤 특별한 치료가 앞으로이 원인을합니까?
  • 우리의 경우에 "잘못된 것 (tm)"을 수행 한 경우 파일을 다른 파일의 복사본으로 befling하는 방법은 무엇입니까?

정확히 HG 복사 할 무엇

+0

[Mercurial : The Definitive Guide]의 [파일 복사] (http://tortoisehg.bitbucket.org/hgbook/1.7/mercurial-in-daily-use.html#chap:daily.copy)도 읽을 수 있습니다. ] (http://tortoisehg.bitbucket.org/hgbook/1.7/) 책. – Matus

답변

14
  • 을 (이 질문은 의욕 메일 링리스트에 질문했다, 당신은. 너무 follow the original thread 할 수 있습니다) 및 특수 어떤 치료는 앞으로이 원인을합니까?

새 파일을 추가하고 이전 파일의 복사본으로 표시합니다. 파일이 사본이기 때문에 원본 파일의 변경 사항이 사본으로 병합됩니다. 시간은 왼쪽에서 오른쪽으로 흐름 :

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt) 
     \     /
     (hg copy a.txt b.txt) 
  • 은 우리의 경우에 대한 '잘못된 일이 (TM)을'어떻게 밝혀지면, 어떻게 다른 파일의 복사본을 beeing는 같은 파일 지움 I에게 을 ?

이 메커니즘은 병합 할 때만 시작됩니다. 위의 그래프에서 공통 조상 수정 기호에 b.txt이 없으면 Mercurial은 을 검색하여 b.txt이 다른 곳에서 복사되었는지 확인합니다.

은 우리가 축약 된 형태로 위의 그래프를 계속하자 :

(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge) 
    \   /        /
    (copy a b) --/------- (edit b) ------------------/ 

문제는 최종 병합을 수행하는 방법이다. 공통 조상 지점 은 이제 copy a b 노드이고 여기에서 ab이 모두 있습니다. 즉, 사본을 검색하지 않아도되는 을 의미합니다! 따라서 두번째 편집은 a이 아니며 은 b으로 병합됩니다. 이중 확인하려면

, 나는 그것을 밖으로 시도 :
$ hg init 
$ echo a > a 
$ hg add a 
$ hg commit -m init 
$ hg copy a b 
$ hg commit -m "copy a b" 

은 사본이었다 b는 이제 a이 포함되어 있습니다.
$ hg update 0 
0 files updated, 0 files merged, 1 files removed, 0 files unresolved 
$ echo aa >> a 
$ hg commit -m "edit a" 
created a new head 
$ hg merge 
merging a and b to b 
0 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 
$ hg commit -m "a edit copied to b" 

첫 번째 병합했고 a에 편집 b에 복사되었습니다

$ cat b 
a 
aa 

우리는 지금 병렬로 변경합니다

$ echo aaa >> a 
$ hg commit -m "edit a again" 
$ hg update 3 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
$ echo bbb >> b 
$ hg commit -m "edit b" 
created new head 
$ hg merge 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

짓을 더 이상 복사가 없습니다 :

$ cat a 
a 
aa 
aaa 
$ cat b 
a 
aa 
bbb 

이것을 사용 중지하는 경우 ... 실제로 복사를 명시 적으로 사용 중지 할 수 없습니다. 그러나 위의 그림을 보여주기를 희망하기 때문에 첫 번째 병합 후에 다시 을 "괴롭히지"않을 것입니다.

첫 번째 병합에 문제가있는 경우 병합을 시작하기 전에 hg resolve --tool internal:local을 사용하여 파일을 해당 상태로 다시 설정할 수 있습니다.

$ hg resolve --tool internal:local b 

으로 우리는 단지 a 하나 개의 라인을 포함하는 다시 b을 가져왔다 수 있도록.

+0

죄송합니다. * ** my * 테스트에서 병합 헤드의 복사 변경 사항을 확인할 수 없습니다 **. '> hg version Mercurial Distributed SCM (버전 2.0.1)' –

+0

또한 첫 번째 병합에 있지 않습니까? 우리가 충분히 토론 할 수 있도록 [email protected]으로 작성하십시오.이 작은 주석 상자보다 훨씬 낫습니다. –

+0

"처음에는 병합하지 않았습니까?" - 예. 전자 메일이 기록되면 메시지가 전송됩니다 (로그 포함) –

관련 문제