버전 관리 시스템에 대한 원자 적 커밋이란 무엇입니까?


답변:


69

즉, 버전 제어 시스템에 커밋을 수행 할 때 커밋하려는 모든 항목이 들어가거나 아무 것도 수행하지 않습니다.

CVS에서 커밋을 시도하면 커밋이 여러 파일에서 성공한 다음 변경되어 다른 여러 파일에서 실패 할 수 있습니다. 커밋의 절반이 없기 때문에 저장소가 불행한 상태로 유지됩니다. 컴파일이 나쁘거나 나 빠지지 않은 상태로 두었을 가능성이 있습니다. 이제 다른 변경 사항을 업데이트하고 다른 변경 사항을 가져 오기 전에 다른 파일을 커밋 할 수 있도록 변경 사항을 신속하게 통합해야합니다.

SVN에서는 이런 일이 발생하지 않습니다. SVN은 변경 한 모든 것을 커밋하거나 전체 변경 세트에 실패합니다. 따라서 커밋 문제로 인해 저장소를 깨진 상태로 두지 않습니다.


9
이것의 중요한 결과는이 경우 것입니다 확인 주어진 상태에서 그 결과가 일관성있는 상태 (예 : 물론, 파일을 커밋 잊고 어떠한 사용자 실수를 금지) 항상 : 그것은 하나 에서 전에 커밋 또는에서 커밋과 그 사이에 아무것도 없습니다. CVS에서는 "반쯤 커밋"할 수 있습니다. SVN 동작은 지속적인 통합과 같은 작업에 매우 좋습니다. CVS 시스템의 경우, 해당 시스템은 체크 아웃 후 지정된 시간 (초 / 분) 동안 더 이상 커밋하지 않으면 지정된 체크 아웃 만 사용하는 "정숙 기간"을 적용하는 데 사용되었습니다.
Joachim Sauer 2018 년

2
내가 이것을 읽는 동안 CVS를 사용하는 것에 대한 어두운 기억이 나를칩니다.
shabunc

9
@Spoike-사실이지만 의도적 인 행위입니다. CVS에서는 자신의 실수없이 문제가 발생할 수 있지만 SVN에서는 문제를 해결해야합니다.
Michael Kohne

3
@DanNeely-CVS가 하나씩 커밋합니다. 그것이 부분 커밋을 얻는 이유입니다-일부 파일은 통과 한 다음 커밋 할 수없는 파일에 충돌하면 중지됩니다 (충돌로 인해). 그것은 CVS가 원래 RCS에서 자란 결과라고 생각합니다.
Michael Kohne

4
또한 CVS를 사용하면 오류가 발생하지 않고 모든 것이 커밋 된 경우에도 더 빠른 연결을 가진 사람이 커밋 도중에 소스 트리를 업데이트하여 일관성이없는 상태로 둘 수 있습니다. (그리고 나는 타임 스탬프가 똑같이 퍼져서 커밋 중간에 떨어진 날짜 / 시간을 기준으로 트리를 확인하려고 시도하면 비슷한 결과를 얻을 것으로 예상한다.)
SamB

15

이것은 Bye-bye CVS 에서 설명 됩니다. Andy Lester가 쓴 기사를 전복했습니다 .

Subversion에서 커밋을 시도했지만 파일 중 하나가 충돌하거나 오래된 경우 파일이 커밋되지 않습니다. CVS에는 지금 당장 수정해야 할 반 커밋 된 파일 세트가 있습니다.

CVS가 프로그래머가 병합을 즉시 수정하도록 강제한다는 사실은 반 생산적입니다. 이에 비해 변경 사항을 지연 / 취소 / 신중하게 병합하는 옵션은 실질적인 이점입니다.


위 기사에서 설명한 CVS에 비해 SVN의 다른 이점은 다음과 같습니다.

  • 수행하는 모든 작업의 ​​로컬 버전
     
    diff를 cvs하려면 리포지토리에 연결할 수 있어야합니다. 그물 연결 없음, 확산 없음. Subversion은 작업중 인 내용의 로컬 사본을 저장하므로 svn diff는 정상적으로 작동합니다. 다시 시작하고 싶습니까? svn revert도 연결되지 않은 상태로 작동합니다.

  • 개정의 상징적 이름
     
    HEAD는 CVS의 트렁크 팁 이름이지만 PVCS 시절에 되돌아 갈 수있는 것처럼 항상“-r-1”을 말하고 싶었습니다. CVS를 사용하면 편집중인 항목에 cvs 로그를 작성한 다음 빼야합니다. 재미 없어 Subversion을 사용하면 svn diff -r PREV라고 말할 수 있습니다.

  • 실제 상태보고
     
    CVS에서 서버의 어떤 것이 더 최신인지 확인할 수있는 유일한 방법은 cvs 업데이트이며 다운 된 내용이 충돌을 일으키지 않기를 바랍니다. svn status 명령을 사용하면 실제 상태가되므로 업데이트를 수행하기 전에 충돌이 있는지 확인할 수 있습니다.

  • 병합 충돌의 유용한 처리
     
    CVS에서 충돌 이있는 경우 파일에 충돌 마커가 나타납니다. Subversion에서는 충돌 표시기 (원래 사전 충돌 파일의 사본)와 서버에서 내려온 버전 및 원래 편집했던 버전을 얻게됩니다. 그런 다음 filename.txt를 명시 적으로 svn resolve하여 Subversion에 문제가 해결되었음을 알려야합니다. 더 이상 충돌 마커가있는 CVS에 실수로 다시 커밋하지 않아도됩니다.


8

이는 모든 파일에 대한 모든 변경 사항이 단일 트랜잭션으로 커밋되므로 모두 성공하거나 없음을 의미합니다.

즉, 저장소에 부분 편집을 체크인 할 가능성이 적어 빌드가 실패합니다. 사람들이 여전히 모든 관련 파일을 체크인하는 것을 잊어 버릴 수는 있지만 버전 관리 시스템의 문제가 아니라 프로세스 문제입니다.


그럼 좋지 않나요? 그렇지 않으면 부분 커밋으로 인해 파일이 동기화되지 않을 수 있습니다.
Geek

2
그렇습니다. 부분 커밋은 좋지 않습니다
jk.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.