Programing

실수로 체크인 취소

crosscheck 2020. 12. 29. 07:40
반응형

실수로 체크인 취소


Subversion을 사용 중이며 준비가되기 전에 실수로 일부 코드를 체크인했습니다. 예를 들어, 나는 종종 : a) 일부 코드를 체크인 한 다음 b) 약간 편집 한 다음 c) 눌렀다가 입력하여 불행히도 체크인이었던 이전 명령을 반복합니다.

Subversion을 사용하여 서버에서 이러한 실수로 체크인을 철회 할 수 있습니까?


NB : 이것은 아마도 현재 버전의 구독에서 작동하지 않을 것이고 나쁜 생각입니다.하지만 정보를 위해 여기에 남겨 두었습니다.

NB : 일반적으로 실수로 체크인 한 경우 커밋을 되돌려 야합니다.이 질문에 대한 다른 답변을 참조하십시오. 그러나 커밋의 효과를 실제로 실행 취소하고 저장소를 이전과 동일하게 변경하는 방법을 알고 싶다면 아래에 몇 가지 설명이 있습니다.

이것은 일반적으로 원하는 것은 아니지만 실제로 저장소에서 실제 커밋 된 버전을 제거하려면 다음과 같이 저장소에서 불쾌한 롤백을 수행 할 수 있습니다 (이는 $REV최신 개정으로 설정되어 있다고 가정합니다. 풀이):

  • 이러한 변경으로 인해 저장소 가 손상 될 수 있으므로 먼저 저장소를 백업하십시오 (아래 가정 참조).
  • 혼동되지 않도록 로컬 사본을 이전 버전으로 되돌립니다 ( svn revert -r $((REV-1))).
  • 저장소에서 db/revs/$REVdb/revprops/$REV
  • 저장소에서 db/current및 (Subversion 1.6 이상의 경우) 제거 db/rep-cache.db하고 실행하십시오.svnadmin recover .
  • ( 가능한 경우) 읽기 전용 데이터베이스 오류 를 쓰려는 시도를db/rep-cache.db 방지하기 위해 권한을 조정 합니다.

이것은 모두 다음을 가정합니다.

  • fsfs기반 저장소를 사용하고 있습니다.
  • Subversion 릴리스가보다 큼 1.5.0(그렇지 않으면 db/current실행하는 대신 개정 번호 를 수동으로 편집 하고 변경해야 함 svnadmin recover .)
  • 다른 후속 개정이 커밋되지 않았습니다.
  • 저장소의 파일 시스템에 대한 쓰기 권한이 있습니다.
  • 위의 작업을 수행하는 동안 다른 사람이 액세스를 시도하는 것을 두려워하지 않습니다.

나는 히스토리 (및 미러 등)에 영원히 머물고 싶지 않은 저장소에 거대한 파일이 커밋되었을 때 그렇게했습니다. 어떤 식 으로든 이상적이거나 정상적인 관행이 아닙니다 ...


참고 항목 SVNBook , 특히 '변경 사항 취소'섹션, 그리고 역 병합.

svn merge의 또 다른 일반적인 용도는 이미 커밋 된 변경 사항을 롤백하는 것입니다. / calc / trunk의 작업 복사본을 즐겁게 작업하고 있고 integer.c를 변경 한 개정판 303에서 변경된 내용이 완전히 잘못되었음을 발견했다고 가정 해 보겠습니다. 커밋되어서는 안됩니다. svn merge를 사용하여 작업 복사본의 변경 사항을 "실행 취소"한 다음 리포지토리에 로컬 수정을 커밋 할 수 있습니다. 당신이해야 할 일은 역 차이를 지정하는 것입니다 :

$ svn merge -r 303 : 302 http://svn.example.com/repos/calc/trunk

명확히하기 위해 초기 변경 사항은 여전히 저장소에 있습니다. 그러나 이제 이후 개정에서 철회했습니다. 즉, 저장소가 모든 변경 사항을 캡처했습니다 (정말 원하는 것입니다! 일반 텍스트 암호 또는 유사한 것을 체크인하지 않은 경우!).


경고 : 수락 된 답변 (David Fraser)은 SVN 1.5 저장소에서 작동해야하지만 SVN 1.6 db/rep-cache.db에서는 다음 커밋 전에 삭제해야합니다. 그렇지 않으면 저장소가 손상 되어 다음에 완료를 시도 할 때까지 인식하지 못할 수 있습니다. 점검. "잘못된 표현 헤더"오류와 함께 후속 전체 체크 아웃이 실패하는 것을 보았습니다.

rep-cache.db는 무엇입니까? FSFS 레이아웃에 대한 문서가 이 파일을 삭제하면 당신은 "담당자 공유 기능"을 잃게됩니다 말한다; 그러나 다음 커밋에서 다시 생성됩니다. 표현 공유는 1.6에서 추가되었습니다 .


TortoiseSVN을 사용하여 로그 표시를 선택하고 되돌리려는 개정을 찾습니다. 상황에 맞는 메뉴에서이 개정으로 되돌리기를 선택합니다. 이렇게하면 작업 복사본에 역 병합이 수행되므로 작업 복사본을 커밋하여 작업을 완료해야합니다.

작업 복사본의 분기를 어떻게 추적합니까?를 참조하십시오 . :-)


당신이 의미하는 바가 있다면, 실수로 체크인 한 기록을 어떻게 깨끗하게 제거 할 수 있습니까? 이것은 어렵습니다.

svn은 개정을 변경 세트로 저장하기 때문에 어떤 것도 취소 할 수 없습니다. 그러나 저장소 덤프에서 거의 모든 작업을 수행 할 수있는 도구가 있습니다. 당신 은 할 수 있습니다 :

  1. 저장소를 덤프하십시오.

  2. svn 관리 도구 에서 svndumpfilter사용 하여 체크인을 제거하십시오.

  3. repo에 다시 넣으십시오.

그러나 이것은 당신의 repo를 완전히 망칠 수 있으므로 당신이 무엇을하고 있는지 절대적으로 알고 모든 것을 백업하지 않는 한 절대로 이것을 시도하지 마십시오.


개정판을 제거 할 수 없습니다. 여기에 몇 가지 답변이 원하는 것을 완전히 오해하는 것 같습니다. 그러나 체크인 메시지를 변경하여 의도하지 않았 음을 나타낼 수 있습니다. 체크인은 비용이 많이 들지 않으므로 이상한 추가 비용을 갖는 것은 큰 문제가 아닙니다.


예, 이것이 바로 Subversion의 목적입니다.

당신이해야 할 일은 SVN 저장소의 이전 버전으로 사본을 교체하는 것입니다.

몇 가지 옵션이 있습니다.

  1. 개정판으로 교체하십시오.
  2. URL로 바꾸기
  3. 저장소의 최신 버전 (귀하의 경우에는 이미 최신 버전이 있음)
  4. 분기로 바꾸기

그러나 로컬 사본을 교체하기 전에 다음을 수행하는 것이 좋습니다.

  1. 'Repository / Revision / URL과 비교'를 수행하십시오.

나는 그것을 의심 할 것이다. 소스 제어의 주요 아이디어 중 하나는 저장소가 기록을 잃지 않는다는 것입니다. 기록을 삭제할 수 없습니다. 할 수있는 최선의 방법은 이전 버전을 가져 와서 현재 버전을 덮어 쓰는 것입니다. 그러나 기록 로그에는 여전히 실수가 표시됩니다.

(Offtopic : 어떤 종류의 IDE를 사용하고 있습니까?)


개정을 철회 할 수 없습니다. 가장 할 수있는 일은 이전 개정으로 되돌리고 다시 체크인하는 것입니다.


이것에 대해서도 언급하려면 : 이것은 리비전 2에서 리비전 1로 되돌리기 위해 리포지토리에서 수행 한 일련의 명령입니다. 그래도 마지막에 체크인해야합니다.

Last login: Mon Apr 13 16:01:34 on ttys004
[wlynch@orange ~] cd /tmp
[wlynch@orange /tmp] svnadmin create foo
[wlynch@orange /tmp] svn co file:///tmp/foo foo-repo
Checked out revision 0.
[wlynch@orange /tmp] cd foo-repo/
[wlynch@orange foo-repo] ls
[wlynch@orange foo-repo] touch blah
[wlynch@orange foo-repo] touch repl
[wlynch@orange foo-repo] touch bar
[wlynch@orange foo-repo] svn add *
A         bar
A         blah
A         repl
[wlynch@orange foo-repo] svn ci
Adding         bar
Adding         blah
Adding         repl
Transmitting file data ...
Committed revision 1.
[wlynch@orange foo-repo] echo "hi" > bar
[wlynch@orange foo-repo] echo "oh no" > blah
[wlynch@orange foo-repo] svn ci
Sending        bar
Sending        blah
Transmitting file data ..
Committed revision 2.
[wlynch@orange older-foo] svn diff -r 1:2 file:///tmp/foo
Index: bar
===================================================================
--- bar (revision 1)
+++ bar (revision 2)
@@ -0,0 +1 @@
+hi
Index: blah
===================================================================
--- blah    (revision 1)
+++ blah    (revision 2)
@@ -0,0 +1 @@
+oh no

[wlynch@orange foo-repo] svn diff -r 1:2 file:///tmp/foo | patch -R
patching file bar
patching file blah    

예를 들어 실수로 변경하기 어려운 암호를 커밋 한 경우와 같이 서버에서 저장소를 편집해야하는 경우가 있습니다. 여기에 내가 완전히 안전하다고 믿는 방법이 있습니다 (@David Fraser의 답변은 나를 위해 repo 손상을 일으켰습니다). 주의 :이 방법은 리포지토리의 끝에서만 수정 사항을 제거하므로 실수를 즉시 알아 차릴 때 가장 유용합니다.

  1. 모든 사용자에게 리포지토리가 오프라인이되며 서버에서 새 체크 아웃을 만들어야한다고 알립니다.
  2. 리포지토리를 오프라인으로 전환하고 백업 복사본을 가져 와서 기본 리포지토리를 reponame_old와 같은 이름의 안전한 위치로 이동합니다.
  3. Dump your repo to a single-file representation, leaving the unwanted revisions off the end:
    • svnadmin dump -r 0:N > reponame.dump
    • e.g. svnadmin dump -r 0:6610 > reponame.dump will remove revs 6611 onwards
    • Note that the repodump file could be twice the size of your repo folder.
  4. Create a new repo to load these revisions into:
    • svnadmin create reponame
  5. Load the trimmed set of revisions into the new repo
    • svnadmin load reponame < reponame.dump
  6. Apply any necessary customisations to your new repo (e.g. hooks) and return it to service.
    • We're using VisualSVN server so had to restore the conf\VisualSVN-WinAuthz.ini file.
    • We also saw some odd behaviour until we rebooted the server, so VisualSVN may cache the repo state; YMMV with other hosting setups.
  7. Don't forget to either delete the backup with the secret data, or put it somewhere safe.
  8. Tell all the users to do a new svn checkout from the repo server.

ReferenceURL : https://stackoverflow.com/questions/747713/retract-accidental-checkin

반응형