2013-09-04 4 views
2

좋아, 나는이 명령이 작동한다는 것을 알고 있지만 나는 대답 할 수 없었던 어리석은 질문을 가지고있다.이 시나리오에서 svn update의 흐름은 무엇입니까?

a.txt라는 파일이있는 svn 저장소가 있다고 가정 해 보겠습니다. 사용자 A가 X를 확인하고 a.txt에서 Y로 로컬로 변경하는 것보다 번호가 있습니다. 이제 그는 그것을하기 전에 SVN 업데이트를하기 전에 SVN 업데이트가 충돌을 일으켜야한다는 것이 이상적입니다. 왜냐하면이 두 파일이 모두 다르기 때문입니다. 하지만 내 경우에 SVN 업데이트가 실행되고 저장소와 작업 복사본 사이에 현재 변경 사항이 없다고 말합니다.,

누구든지 내 추론이 정확하다고 말할 수 있습니까? 내 생각에이 시나리오는 정확히 두 사용자 사이의 표준 svn 충돌과 비슷합니다

편집 : sharptooth의 답변을 보면 분명히 내 추론이 잘못되었습니다. 그렇다면 누구나 svn 업데이트의 흐름 개요를 제공해주십시오. ? 즉, R repo 및 W 작업 복사본이있는 경우 diff를 계산하는 동안 svn 업데이트가 찾는 내용은 무엇입니까?

답변

2

로컬 작업 복사본에는 현재 버전의 원래 상태에있는 모든 파일이 들어 있습니다. 이러한 원본 파일은 .svn 폴더에 저장됩니다. .svn 폴더의 크기는 본질적으로 프로젝트 파일의 크기와 같습니다. 업데이트를하면 SVN 클라이언트는이 .svn 폴더를 최신 버전으로 업데이트 한 다음 모든 작업 파일을 업데이트하려고합니다. 일부 파일이 변경되면 작업 파일의 변경 사항을 병합하려고합니다. 병합 할 수 없다면 충돌에 대해 불평 할 것입니다. 새 개정과 작업 파일이 모두 파일의 동일한 행을 변경 한 경우 이런 일이 발생합니다. 그런 다음 낡은 것, 저장소에서 새로 도착한 것, 그리고 자신의 변경 사항을 염두에두고 충돌을 해결해야합니다.

일단 커밋을 실행하면 SVN 클라이언트는 작업 복사본에 최신 버전이 있는지 먼저 확인하고 서버에 작업 파일과 .svn 폴더의 파일 간의 모든 차이점을 보냈는지 확인합니다. 모두 잘되면, 모든 다른 작업 파일을 .svn 폴더에 복사하므로 .svn 폴더가 서버의 저장소와 동기화됩니다.

2

SVN에서 "checkout"은 클라이언트 전용 작업이며 작업 복사본 변경은 클라이언트 전용 작업이기도하므로 저장소는 해당 작업을 전혀 알지 못합니다. 아무도 파일의 저장소 사본을 변경하지 않았기 때문에 충돌에 대한 근거가 없습니다. 어떤 사용자 B가 파일을 마지막으로 업데이트 (또는 체크 아웃) 한 순간과 사용자 A가 해당 업데이트를 수행하는 순간 사이에 동일한 파일에 변경 사항을 적용하면 충돌이 발생합니다.

0

'svn update'는 기본적으로 사용자가 로컬 변경 사항을 우선 적용하도록하기 때문에 충돌을 표시하지 않습니다. 즉, 다른 사용자가 파일을 로컬로 변경 한 동일한 장소에서 다른 것을 커밋 한 경우 충돌하게됩니다. 그렇지 않으면 충돌을 발견하지 못합니다. 아마도 여러분은 업데이트 후에도 'svn diff'를 실행하여 변경 사항을 볼 수 있다는 것을 잘 알고있을 것입니다.

관련 문제