Programming

Subversion에서 이전 버전의 코드로 돌아가려면 어떻게합니까?

procodes 2020. 2. 14. 23:51
반응형

Subversion에서 이전 버전의 코드로 돌아가려면 어떻게합니까?


친구와 프로젝트를 진행 중이며 이전 버전의 코드로 돌아가서 현재 코드로 설정하고 싶습니다. 어떻게합니까?

vs08에서 "anksvn"을 사용하고 있습니다.

PC에 원하는 버전이 있지만 커밋이 실패합니다. 내가받는 메시지는 "커밋이 실패했습니다. 파일 또는 디렉토리가 오래되었습니다."

또한 내 PC에 서브 버전 클라이언트가 있습니다.


기본적으로 "뒤로 병합"해야 합니다. 현재 버전 과 이전 버전 사이의 차이를 현재 버전 적용한 다음 (이전 버전 과 같은 작업 복사본으로 끝남) 다시 커밋합니다. 예를 들어 개정판 150 (현재)에서 개정판 140으로 돌아가려면 다음을 수행하십시오.

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Subversion Red Book에는 이것에 대한 좋은 섹션이 있습니다.


서브 버전 히스토리 헤드 에서만 새로운 변경 사항을 커밋 할 수 있습니다 .

당신이 당신의 PC에 가지고있는 좋은 사본으로 직접 아무것도 할 수없는 이유는 .svn폴더가 과거의 코드임을 알고 있기 때문에 커밋 전에 업데이트가 필요하기 때문입니다.

올바른 개정 번호를 찾아 되 돌리십시오

  1. 원하는 이전 사본의 개정 번호를 찾으십시오.

    다음을 사용하여 현재 개정판을 받으십시오 .

    svn info --show-item revision
    # or
    svn log
    

    또는 이전 버전의 프로젝트 를 확인 하려면 다음을 사용하십시오.

    svn update -r <earlier_revision_number>
    

    올바른 개정 번호를 찾을 때까지

  2. 올바른 개정 번호를 기록해 두십시오 ( 123아래 예 참조).

  3. 최신 개정으로 업데이트하십시오.

    svn update
    
  4. 원하는 개정판과 최신 버전 사이의 모든 변경 사항을 취소하십시오.

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (위의 Jon Skeet의 답변과 동일합니다.)

개정 번호를 찾을 수없는 경우

이전 사본을 찾을 수없고 현재 PC에있는 파일을 커밋하려는 경우 :

  1. 좋은 버전의 사본을 만드십시오 (그러나 .svn폴더는 없습니다).

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. 이제 최신 버전인지 확인하십시오.

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. 작업 버전 상단에 올바른 버전을 복사하십시오.

    이 명령은 올바른 트리에없는 파일을 작업 트리에서 복사하고 삭제하지만 기존 .svn폴더 에는 영향을 미치지 않습니다 .

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    rsync가없는 경우 사용할 수 cp -a있지만 원치 않는 파일을 수동으로 삭제해야합니다.

  4. 지금 가지고있는 것을 커밋 할 수 있어야합니다.

    cd project
    svn commit "Reverted to good copy"
    

이 줄을 사용하십시오

svn 업데이트 -r yourOldRevesion

다음을 사용하여 현재 개정판을 알 수 있습니다.

svn 정보


병합을 사용하여 전체 체크인을 취소하는 표준 방법은 원하는 경우 효과적입니다. 그러나 때로는 단일 파일을 되돌리기 만하면됩니다. 그렇게 할 수있는 합법적 인 방법은 없지만 해킹이 있습니다.

  1. svn log를 사용하여 원하는 버전을 찾으십시오.
  2. svn의 export 하위 명령을 사용하십시오.

    svn 내보내기 http : // url-to-your-file @ 123 / tmp / filename

파일의 올바른 버전에 대한 수정 번호는 123입니다. 그런 다음 해당 단일 파일을 이동하거나 복사하여 이전 파일을 덮어 씁니다. 수정 된 파일을 체크인하면 완료됩니다.


조금 더 구식

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

그리고 평소

svn diff
svn commit

나는 이것이 가장 적합하다고 생각합니다.

예를 들어, 커밋 된 코드에 rev 5612에서 5616 로의 개정이 포함 된 경우 병합을 뒤로 병합하십시오. 그것은 내 끝에서 작동합니다.

예를 들어 :

svn merge -r 5616:5612 https://<your_svn_repository>/

병합 된 코드가 이전 개정으로 돌아 가면 커밋 할 수 있습니다.


이것이 내가하고 일한 것입니다.

특정 시간 동안 수행 한 여러 커밋의 변경 사항을 취소하고 이전 커밋 지점으로 가고 싶습니다.

  1. 팀-> 히스토리 표시로 이동하십시오.
  2. 무시하려는 개정 또는 범위를 마우스 오른쪽 버튼으로 클릭하십시오.
  3. "변경 사항 되돌리기"옵션을 선택하십시오.

작업 복사본의 변경 사항을 취소하면서 역 병합이 실행됩니다.

코드를 검토하고 커밋하십시오.


되돌리려는 최상위 계층 구조를 마우스 오른쪽 버튼으로 클릭 >> Revert또는Revert to Revision


이전 답변의 대부분은 역 병합을 사용했으며 일반적으로 정답입니다. 그러나 그렇지 않은 한 가지 상황 (나에게 일어난 일)이 있습니다.

작은 변경을 할 때 실수로 Unix 줄 끝이있는 파일을 DOS 줄 끝으로 변경하고 커밋했습니다. 이것은 줄 끝을 변경하고 다시 커밋하거나 역 병합하여 쉽게 취소 할 수 있지만 svn blame파일의 모든 줄의 소스로 내 편집 목록 을 만드는 효과가 있습니다. 흥미롭게도 Windows의 TortoiseSVN은 이것의 영향을받지 않으며 명령 줄 만 영향을받습니다 svn blame.

에서보고 한대로 기록을 유지 svn blame하려면 다음을 수행해야한다고 생각합니다.

  • 파일을 삭제하고 커밋하십시오.
  • 저장소에서 파일의 이전 양호한 사본을 헤드에 복사하고 커미트하십시오.
  • 유지하려는 편집 내용을 복원하십시오.

삭제는 약간 무섭지 만 항상 파일을 리포지토리에 저장 했으므로 복원하는 것이 중요하지 않습니다. 다음은 단계를 설명하는 코드입니다. xxx이것이 마지막 양호한 사본의 개정 번호 라고 가정하십시오 .

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

저장소의 사본의 경우 대상은 파일 이름이 아닌 디렉토리 여야합니다.


프로젝트> 바꿀 내용> 수정본 또는 URL을 클릭하고 되돌릴 특정 수정본을 선택하십시오.

이제 로컬 업데이트 코드 버전을 저장소에 커밋하십시오. 이것은 코드베이스를 특정 개정으로 되돌릴 것입니다.


이전 버전과 동기화하고 커밋하십시오. 이것은 트릭을해야합니다.

여기 또한 변경 취소에 대한 설명.


Jon Skeet의 대답은 간단히 말해서 해결책이지만, 당신이 나와 같다면 설명을 원할 수도 있습니다. Subversion 매뉴얼은 이것을

체리 픽 병합

매뉴얼 페이지에서.

  1. 이 형식을 '체리 픽'병합이라고합니다. '-r N : M'은 수정본 N과 M 사이의 소스 분기 히스토리 차이를 나타냅니다.

    '역 범위'를 사용하여 변경을 취소 할 수 있습니다. 예를 들어 소스와 대상이 동일한 분기를 참조 할 경우 이전에 커밋 된 개정은 '실행 취소'될 수 있습니다. A의 리버스 레인지 또는 "-c"옵션은 음수로 사용되는 「M N -r ', N은 M에서보다 큰 "-c -M'에 해당 'M -r'. 이와 같은 변경을 취소하는 것을 '역 병합'수행이라고도합니다.


  • 소스가 파일 인 경우 해당 파일에 차이가 적용됩니다 (이전 변경 내용을 병합하는 데 유용함). 그렇지 않으면 소스가 디렉토리 인 경우 대상의 기본값은 '.'입니다.

    일반적인 사용법에서 작업 복사본은 단일 수정으로 로컬 수정 및 하위 트리 전환없이 최신 상태 여야합니다.

예:

svn merge -r 2983:289 path/to/file

이것은 로컬 사본 [2983] (위의 인용에 따라 서버와 동기화되어야합니다-귀하의 책임)을 서버의 개정 289로 대체합니다. 변경 사항은 로컬에서 발생합니다. 즉, 체크 아웃이 깨끗하면 변경 사항을 커밋하기 전에 검사 할 수 있습니다.


이 페이지에는 많은 위험한 답변이 있습니다. SVN 버전 1.6 이후로 업데이트 -r을 수행하면 트리 충돌이 발생할 수 있으며 트리 충돌에 대한 정보를 찾기 위해 인터넷에서 악의적 인 데이터를 잃어 버릴 수 있습니다.

버전으로 되 돌리는 올바른 방법은 다음과 같습니다.

svn merge -r HEAD:12345 .

여기서 12345는 버전 번호입니다. 점을 잊지 마십시오.


다음은 나를 위해 일했습니다.

로컬 변경 사항이 많았으므로 로컬 사본의 변경 사항을 삭제하고 SVN의 마지막 안정 버전을 체크 아웃해야했습니다.

  1. 무시 된 파일을 포함하여 모든 파일의 상태를 확인하십시오.

  2. 새로 추가되고 무시 된 파일을 얻으려면 모든 줄을 정리하십시오.

  3. 로 교체하십시오 //.

  4. 그리고 rm -rf 모든 줄.

    svn 상태-무시 | grep '^ [? I]'| sed "s / ^ [? I] //"| xargs -I {} rm -rf "{}"

참고 URL : https://stackoverflow.com/questions/814433/how-do-i-return-to-an-older-version-of-our-code-in-subversion



반응형