2014-02-26 6 views
2

최근 svn에서 수은으로 전환했습니다. 우리는 우리의 저장소를위한 BitBucket과 우리의 (추가) 소스 제어 GUI로서의 SourceTree와 함께 MercurialEclipse 플러그인과 함께 IDE로서 Aptana를 사용하고 있습니다.커밋 된 파일의 하위 집합 만 푸시하는 방법은 무엇입니까?

나는 Aptana에서 2 개의 새 파일을 만들고 각각을 커밋했습니다. 이제 두 개의 파일이 "나가는 중"으로 나열된 동기화보기에서 중 하나만 중 하나만 누 르고 싶습니다. 상단에있는 "push all"아이콘을 사용하면 나가는 모든 변경 사항을 푸는 대신에 나가는 목록의 특정 파일을 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 "push"를 선택했습니다. 그러나 이로 인해 보내는 변경 내용을 밀어 넣었습니다. 커밋 된 변경 사항의 특정 파일 또는 하위 집합 만 푸시하는 옵션을 찾을 수없는 것 같습니다. 앱 타나에서 이것을 수행 할 수있는 방법이 있습니까?

답변

1

참고 : 내 대답은 Aptana와 관련이 없으며, 대신 귀하의 문제가 무엇인지에 대해 설명합니다.

주된 문제는 Mercurial이 변경 사항을 저장하는 방법에 대한 오해이며 Subversion 배경에서 오는 것이 완전히 합리적이라고 생각합니다.

Subversion에서는 변경 기록이 파일별로 저장되는 것으로 간주 될 수 있습니다. 즉, 두 파일을 변경하고 커밋하면 작업 복사본의 파일이 서로 다른 버전에있는 상황을 쉽게, 때로는 할 수 있습니다.

Mercurial에서 변경 기록은 전체 저장소에 저장됩니다. 커밋하면 그 당시 전체 저장소의 상태를 저장하는 새로운 "변경 집합"이 만들어집니다. push을 다른 저장소로 변경하면 모든 변경 사항 (또는 추가 또는 삭제 또는 ...)이 해당 변경 사항과 함께 푸시됩니다.

저장소에 새로운 변경 집합 commit을 선택하면 파일을 선택적으로 포함하거나 제외 할 수 있습니다. 포함되지 않은 파일은 새 변경 집합에서 커밋 될 수있는 보류중인 수정으로 작업 복사본에 남아 있습니다.

나는 그것이 당신을 이해할 수 있기를 바랍니다. 만약 당신이 이미 그것을 이해한다면 그것은 논리적 인 개념이지만, 설명하기가 까다 롭습니다.

그럼, 문제가 있습니다.

저장소에 두 개의 파일, file1file2 (그 또는 foobar)이 있다고 가정 해 보겠습니다. 당신은 그들 모두를 변경했습니다,하지만 그들은 다른 문제와 관련 - 서로 다른 변경 집합으로 최선을 다하고 할 수 있습니다

다음
$ hg log 
changeset 0:.... 
summary: First commit 

$ hg st 
M file1 
M file2 

$ hg commit -I file1 -m "Changed file1" 

$ hg log 
changeset 1:.... 
summary: Changed file1 

changeset 0:.... 
summary: First commit 

$ hg st 
M file2 

우리가 저장소에 하나 개의 파일 만 약속 한 것을 볼 수 있습니다, 그것을 새로운을 만들어졌다 그 때 리포지터리 (repository)의 완전한 상태와 함께 변경 세트 -을 변경하면 file2가됩니다. 이제 우리는 동일한 변경 작업을 수행 할 file2 커밋을 할 수 있습니다. 이 접근 방식의 문제점은 변경 집합이 부모에 따라 정렬된다는 것입니다. 따라서 file2으로 변경하는 것만으로도 부모를 밀어 넣지 않고도 push을 쉽게 변경할 수는 없지만 나중에 변경 한 것일 수 있습니다.


TL : DR : SVN은 개별 파일의 상태를 저장하며, Mercurial은 저장소 전체의 상태를 저장합니다.

나는 매우 독서하는 것이 좋습니다 Mercurial: The Definitive Guide.구식 이라기보다는 구식이긴하지만 개념을 이해하는 것이 훨씬 더 효과적 일 것이라고 생각합니다.