[svn] Subversion에서 커밋되지 않은 변경 사항을 일시적으로 제거하십시오 ( “git-stash”)

Subversion 저장소에 저장된 소프트웨어를 프로그래밍하는 동안 종종 일부 파일을 수정 한 다음 주요 작업을 위해 준비 변경을하고 싶습니다. 예를 들어 새로운 기능을 구현하는 동안 리팩터링이 도움이 될 수 있습니다.

관련이없는 두 가지 변경 사항을 혼합하지 않기 위해 이러한 경우에는 변경 사항을 “버려두고”즉, 리포지토리 버전으로 되돌리고 다른 변경을 수행 한 다음 커밋 한 다음 변경 내용을 “반입”하고 싶습니다.

git-stash 는 그렇게 할 수 있습니다. Subversion에서 직접 또는 일부 플러그인 또는 스크립트를 사용 하여이 작업을 수행 할 수있는 방법이 있습니까? 이클립스 플러그인도 좋습니다.



답변

작업 사본의 한 작업에서 커밋되지 않은 변경 사항이 있고 다른 작업으로 전환해야하는 경우 다음 두 가지 중 하나를 수행합니다.

  1. 두 번째 작업에 대한 새 작업 복사본을 확인하십시오.

    또는

  2. 지점을 시작하십시오.

    workingcopy$ svn copy CURRENT_URL_OF_WORKING_COPY SOME_BRANCH
    workingcopy$ svn switch SOME_BRANCH
    workingcopy$ svn commit -m "work in progress"
    workingcoyp$ svn switch WHATEVER_I_WAS_WORKING_ON_BEFORE
    

이것을 자동화하는 데 도움이되는 스크립트가 있습니다.


답변

이 블로그 게시물 은 diff 및 patch 사용을 권장합니다.

  • git stash 대략적으로 svn diff > patch_name.patch; svn revert -R .
  • git stash apply 된다 patch -p0 < patch_name.patch

이것은 메타 데이터 변경 사항을 숨기거나 디렉토리가 생성 / 삭제되지 않는다는 점에 유의하십시오. (예, svn은 git과 달리 디렉토리 내용과 별도로 추적합니다.)


답변

현재 변경 사항을 svn diff패치 파일에 저장 한 다음 작업 사본을 되돌릴 수 있습니다.

svn diff > stash.patch
svn revert -R .

준비 기능을 구현 한 후 patch 유틸리티를 사용하여 패치를 적용 할 수 있습니다.

patch < stash.patch

다른 사람들이 언급했듯이 이것은 svn:properties트리 작업 (파일 및 디렉토리 추가, 제거, 이름 바꾸기)에서 작동 하지 않습니다 .

이진 파일도 문제를 일으킬 수 있습니다. 패치 (또는이 경우 TortoiseSVN이 처리하는 방법)를 모르겠습니다.


답변

가장 쉬운 방법은 다음과 같이 임시 분기를 사용하는 것입니다.

$ svn copy ^/trunk ^/branches/tempbranch
$ svn switch ^/branches/tempbranch
$ svn commit -m "Stashed"
$ svn switch ^/trunk
$ ... hack away in trunk ...
$ svn commit -m "..."
$ svn merge ^/branches/tempbranch .
$ svn rm ^/branches/tempbranch
$ ... continue hacking

좀 더 정기적으로 수행하면 스크립트에 넣을 수 있습니다.


답변

1.10.0 (2018-04-13) 현재 실험 svn shelve명령이 있습니다. ( TortoiseSVN은 명령을 지원합니다. ) 패치를 저장하고 다시 적용하는 데 도움이 될 뿐이므로 svn diff+ 와 같은 제한이 patch있습니다 (즉, 이진 파일을 처리하고 이름을 바꿀 수 없음). ( 편집 : 바이너리 지원이 다음 버전 1.11.0에서 제공되는 것 같습니다 )

편집 ^ 2 : 1.11.0 (2018-10-30 릴리스)에서는 이진 파일이 지원됩니다 . 선반 이름이 바뀐 파일은 지원되지 않습니다. 1.11의 선반은 1.10에서 만든 선반과 호환되지 않습니다.

편집 ^ 3 : 1.12.0 (2019-04-24 릴리스)에서는 복사 및 이름 바꾸기가 지원됩니다 . 1.12의 선반은 이전 버전에서 만든 선반과 호환되지 않습니다.

편집 ^ 4 : 1.13.01.14.0 으로 선반을 바꾸는 데 변화가 없습니다 . 명령은 여전히 ​​실험으로 표시되어 SVN_EXPERIMENTAL_COMMANDS=shelf3있으며 기능을 사용 하도록 정의해야 합니다. 기능이 현재 심사되지 않은 것 같습니다 .

설계 노트는 개발자의 Wiki 에서 찾을 수 있습니다 .

$ svn x-shelve --help
x-shelve: Move local changes onto a shelf.
usage: x-shelve [--keep-local] SHELF [PATH...]

  Save the local changes in the given PATHs to a new or existing SHELF.
  Revert those changes from the WC unless '--keep-local' is given.
  The shelf's log message can be set with -m, -F, etc.

  'svn shelve --keep-local' is the same as 'svn shelf-save'.

  The kinds of change you can shelve are committable changes to files and
  properties, except the following kinds which are not yet supported:
     * copies and moves
     * mkdir and rmdir
  Uncommittable states such as conflicts, unversioned and missing cannot
  be shelved.

  To bring back shelved changes, use 'svn unshelve SHELF'.

  Shelves are currently stored under <WC>/.svn/experimental/shelves/ .
  (In Subversion 1.10, shelves were stored under <WC>/.svn/shelves/ as
  patch files. To recover a shelf created by 1.10, either use a 1.10
  client to find and unshelve it, or find the patch file and use any
  1.10 or later 'svn patch' to apply it.)

  The shelving feature is EXPERIMENTAL. This command is likely to change
  in the next release, and there is no promise of backward compatibility.

Valid options:
  -q [--quiet]             : print nothing, or only summary information
  --dry-run                : try operation but make no changes
  --keep-local             : keep path in working copy

(...)

$ svn x-unshelve --help
x-unshelve: Copy shelved changes back into the WC.
usage: x-unshelve [--drop] [SHELF [VERSION]]

  Apply the changes stored in SHELF to the working copy.
  SHELF defaults to the newest shelf.

  Apply the newest version of the shelf, by default. If VERSION is
  specified, apply that version and discard all versions newer than that.
  In any case, retain the unshelved version and versions older than that
  (unless --drop is specified).

  With --drop, delete the entire shelf (like 'svn shelf-drop') after
  successfully unshelving with no conflicts.

  The working files involved should be in a clean, unmodified state
  before using this command. To roll back to an older version of the
  shelf, first ensure any current working changes are removed, such as
  by shelving or reverting them, and then unshelve the desired version.

  Unshelve normally refuses to apply any changes if any path involved is
  already modified (or has any other abnormal status) in the WC. With
  --force, it does not check and may error out and/or produce partial or
  unexpected results.

  The shelving feature is EXPERIMENTAL. This command is likely to change
  in the next release, and there is no promise of backward compatibility.

Valid options:
  --drop                   : drop shelf after successful unshelve
(...)

$ svn help | grep x-
 x-shelf-diff
 x-shelf-drop
 x-shelf-list (x-shelves)
 x-shelf-list-by-paths
 x-shelf-log
 x-shelf-save
 x-shelve
 x-unshelve


답변

svn으로 쉽게 수행 할 수있는 방법을 모르겠습니다. 솔직히 git-svnsvn 작업 복사본으로 작동하는 git repo를 작성 git stash하고 그와 함께 사용 하는 것이 좋습니다. 와 함께 교체 git pull하고 교체 하면 실제로 git 워크 플로우의 90 %를 유지하고 여전히 svn 서버와 통신 할 수 있습니다.git svn rebasegit pushgit svn dcommit


답변

svn-stashGPL 3 : https://github.com/frankcortes/svn-stash 에서 사용할 수 있는 작은 Python 2 스크립트가 있습니다 .

그것은 svn diff/patch언급 된 솔루션 과 같이 작동 하며 일부 로컬 디렉토리에 차이점으로 변경 사항을 푸시하고 터지는 것을 제공합니다. 불행히도, 숨김은 이름을 지정할 수 없으며 마지막 것만 튀어 나올 수 있습니다 (예, 스택이지만 그러한 제한에 대한 실제 이유는 없습니다.) 그러나 항상 누락 된 기능을 출처.

* ix 용으로 작성되었지만 모든 “/”를 바꾸면 os.sepWindows에서도 잘 작동합니다.

svn 1.7 이상을 사용하는 경우 1.7 WC에는 최상위 .svn 하위 디렉토리가 하나만 있으므로 is_a_current_stash()line을 제거 해야합니다 if ".svn" in os.listdir(CURRENT_DIR):.