developer tip

Subversion 작업 복사본에서 디렉토리 이름을 바꾸는 건전한 방법

optionbox 2020. 11. 12. 08:08
반응형

Subversion 작업 복사본에서 디렉토리 이름을 바꾸는 건전한 방법


어떻게 든 VCS (일반 svn, git 및 git-svn 사용자)에 정통하지만이 독특한 SVN 동작에 대해 머리를 감쌀 수는 없습니다.

다른 '깨끗한'상태에서 SVN 작업 복사본의 디렉토리 이름을 변경해야 할 때마다-즉, svn status아무것도 반환하지 않고 다른 모든 수정 사항이 커밋되었습니다-그렇게 (svn 문서가 제안하는 것입니다) :

svn mv foo bar
svn commit

SVN이 크게 불평합니다.

Adding         bar
Adding         bar/toto
Deleting       foo
svn: Commit failed (details follow):
svn: Item '/test/foo' is out of date

원하는대로 :

svn update

다음을 제공합니다.

   C foo
At revision 46.
Summary of conflicts:
  Tree conflicts: 1

트리 충돌이 있지만 타사 변경은 발생하지 않았습니다 . 분명히,이 나무 충돌에서 벗어나는 유일한 방법은 일반적으로 (svn red book에서) :

svn resolve --accept working -R .
svn commit

리포지토리에서 원격으로 이름을 바꾼 다음 작업 복사본을 업데이트하는 것은 매우 혼란스러운 것 같습니다.

url=$(svn info | grep -e '^URL:' | sed 's/^URL: //') svn mv $url/foo $url/bar
svn update

내가 놓친 폴더의 이름을 바꾸는보다 합리적이고 승인 된 방법이 있습니까? 특히 놀라운 트리 충돌 상태의 근본 원인은 무엇입니까?


svn mv 나를 위해 작동 :

C:\svn\co>svn mv my_dir new_dir
A         new_dir
D         my_dir\New Text Document.txt
D         my_dir


C:\svn\co>svn commit -m foo
Raderar             my_dir
Lägger till         new_dir

Arkiverade revision 2.

C:\svn\co>

svn의 스웨덴어 출력에 대해 죄송합니다.

귀하의 경우에는 다른 문제가있을 것입니다.

편집 :
Lloeki의 의견에서 지적했듯이

동작을 재현하려면 폴더에 포함 된 파일을 업데이트하고 커밋해야하지만 폴더 자체는 업데이트하지 않아야합니다.

file commit은 repo에 새 rev n을 생성하지만 로컬 메타 데이터는 업데이트되지 않으므로 (항상 그렇듯이 커밋 후 svn log 참조) dir 메타 데이터는 rev n-1에 있습니다. svn은 메타 데이터 차이로 인해 커밋되지 않으며 실제로 dir에 충돌이 있기 때문에 업데이트되지 않습니다. 메타 데이터 업데이트 대 삭제.

동작은 "예상"이며 "해결 방법"은 svn rename명령을 실행하기 전에 작업 복사본을 업데이트하는 것 입니다.


좋아, 나는 이것에 부딪 혔고 마침내 간단한 터미널 세션으로 문제를 재구성 할 수있다. 문제 svn mv는 파일 (이동 / 이름을 바꾸면) 발생한다. 그런 다음 변경 사항을 적용하십시오. 그런 다음 ( 먼저 수행 하지 않고svn update ) svn mv이전에 이동 / 이름 변경이 커밋 된 파일의 상위 디렉토리-마지막으로 svn commit디렉토리 이름 변경을 수행합니다 . 또는 수락 된 대답따르면 " 또한 업데이트하고 커밋해야합니다. 폴더에 포함 된 파일이지만 폴더 자체를 업데이트하지는 않습니다 . "; 그러나이 모든 것은 부모 (또는 조상) 디렉토리에서 실행됩니다. 다음은 문제를 보여주는 명령 줄 로그입니다.

$ cd /tmp
$ svnadmin create myrepo
$ svn co file:///tmp/myrepo myrepo-wc
Checked out revision 0.

$ cd myrepo-wc/
$ mkdir -p dir1/dir2/dir3
$ svn add dir1/
A         dir1
A         dir1/dir2
A         dir1/dir2/dir3

$ svn ci -m 'add dir1/'
Adding         dir1
Adding         dir1/dir2
Adding         dir1/dir2/dir3

Committed revision 1.

$ echo test1 >> dir1/dir2/dir3/test1.txt
$ echo test2 >> dir1/dir2/dir3/test2.txt
$ svn add dir1/
svn: warning: 'dir1' is already under version control
$ svn add dir1/*
svn: warning: 'dir1/dir2' is already under version control
$ svn add dir1/dir2/dir3/*
A         dir1/dir2/dir3/test1.txt
A         dir1/dir2/dir3/test2.txt
$ svn status
A       dir1/dir2/dir3/test2.txt
A       dir1/dir2/dir3/test1.txt
$ svn ci -m 'add dir1/dir2/dir3/*'
Adding         dir1/dir2/dir3/test1.txt
Adding         dir1/dir2/dir3/test2.txt
Transmitting file data ..
Committed revision 2.

$ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt
A         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test2.txt
$ svn status
D       dir1/dir2/dir3/test2.txt
A  +    dir1/dir2/dir3/test2X.txt
$ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt'
Deleting       dir1/dir2/dir3/test2.txt
Adding         dir1/dir2/dir3/test2X.txt

Committed revision 3.

$ svn status
$ svn mv dir1/dir2/dir3 dir1/dir2/dir3X
A         dir1/dir2/dir3X
D         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test1.txt
D         dir1/dir2/dir3
$ svn status
D       dir1/dir2/dir3
D       dir1/dir2/dir3/test2X.txt
D       dir1/dir2/dir3/test1.txt
A  +    dir1/dir2/dir3X
D  +    dir1/dir2/dir3X/test2.txt
$ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X'
Deleting       dir1/dir2/dir3
svn: Commit failed (details follow):
svn: Directory '/dir1/dir2/dir3' is out of date
$ svn status
D       dir1/dir2/dir3
D       dir1/dir2/dir3/test2X.txt
D       dir1/dir2/dir3/test1.txt
A  +    dir1/dir2/dir3X
D  +    dir1/dir2/dir3X/test2.txt
$ svn up
   C dir1/dir2/dir3
At revision 3.
Summary of conflicts:
  Tree conflicts: 1

그리고 이것이 svn up그랬어 야했던 방식입니다- 파일 이동 / 이름 변경이 실행 후에 수행합니다 . 명령 svn status -v후 변경으로 보고 된 버전 번호에 유의하십시오 svn update.

$ cd /tmp
$ rm -rf myrepo*

$ svnadmin create myrepo
$ svn co file:///tmp/myrepo myrepo-wc
Checked out revision 0.

$ cd myrepo-wc/
$ mkdir -p dir1/dir2/dir3
$ svn add dir1/
A         dir1
A         dir1/dir2
A         dir1/dir2/dir3
$ svn ci -m 'add dir1/'
Adding         dir1
Adding         dir1/dir2
Adding         dir1/dir2/dir3

Committed revision 1.

$ echo test1 >> dir1/dir2/dir3/test1.txt
$ echo test2 >> dir1/dir2/dir3/test2.txt
$ svn add dir1/dir2/dir3/*
A         dir1/dir2/dir3/test1.txt
A         dir1/dir2/dir3/test2.txt
$ svn status
A       dir1/dir2/dir3/test2.txt
A       dir1/dir2/dir3/test1.txt
$ svn ci -m 'add dir1/dir2/dir3/*'
Adding         dir1/dir2/dir3/test1.txt
Adding         dir1/dir2/dir3/test2.txt
Transmitting file data ..
Committed revision 2.

$ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt
A         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test2.txt
$ svn status
D       dir1/dir2/dir3/test2.txt
A  +    dir1/dir2/dir3/test2X.txt
$ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt'
Deleting       dir1/dir2/dir3/test2.txt
Adding         dir1/dir2/dir3/test2X.txt

Committed revision 3.

$ svn status
$ svn status -v
                 0        0  ?           .
                 1        1 username dir1
                 1        1 username dir1/dir2
                 1        1 username dir1/dir2/dir3
                 3        3 username dir1/dir2/dir3/test2X.txt
                 2        2 username dir1/dir2/dir3/test1.txt
$ svn up
At revision 3.
$ svn status -v
                 3        3 username .
                 3        3 username dir1
                 3        3 username dir1/dir2
                 3        3 username dir1/dir2/dir3
                 3        3 username dir1/dir2/dir3/test2X.txt
                 3        2 username dir1/dir2/dir3/test1.txt
$ svn mv dir1/dir2/dir3 dir1/dir2/dir3X
A         dir1/dir2/dir3X
D         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test1.txt
D         dir1/dir2/dir3
$ svn status
D       dir1/dir2/dir3
D       dir1/dir2/dir3/test2X.txt
D       dir1/dir2/dir3/test1.txt
A  +    dir1/dir2/dir3X
$ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X'
Deleting       dir1/dir2/dir3
Adding         dir1/dir2/dir3X

Committed revision 4.

$ svn status
$ svn status -v
                 3        3 username .
                 3        3 username dir1
                 3        3 username dir1/dir2
                 4        4 username dir1/dir2/dir3X
                 4        4 username dir1/dir2/dir3X/test2X.txt
                 4        4 username dir1/dir2/dir3X/test1.txt
$ svn up
At revision 4.
$ svn status -v
                 4        4 username .
                 4        4 username dir1
                 4        4 username dir1/dir2
                 4        4 username dir1/dir2/dir3X
                 4        4 username dir1/dir2/dir3X/test2X.txt
                 4        4 username dir1/dir2/dir3X/test1.txt

그리고 OP가 말했듯이- svn update새 이동 / 이름 변경 + 커밋 전에 "커밋 실패"가 발생하기 전에 수행하는 것을 잊으면 svn resolve --accept working -R .커밋 작업을 완료하는 데 사용할 수 있습니다.


이것은 나를 위해 일했습니다.

vi someotherfile
...various changes to the other file
svn mv olddir newdir
svn commit -m"Moved olddir out of the way" olddir
svn commit -m"New location of olddir" newdir
svn update
svn commit -m"Changed someotherfile" someotherfile

나는 다양한 다른 가능한 방법이 있다고 생각하며 svn mv를 수행하기 전에 깨끗한 작업 디렉토리가 있는지 확인하는 것도 트릭을 수행했을 것입니다.


다른 사용자가 저장소에서 디렉토리를 변경 한 시나리오를 생각할 수 있습니다. 작업 복사본에서 동일한 폴더의 이름을 바꾸면 커밋 중에 트리 충돌이 발생할 수 있습니다.

Resolving conflicts shows how to resolve 'tree conflicts' in subversion.

참고URL : https://stackoverflow.com/questions/3941291/a-sane-way-to-rename-a-directory-in-subversion-working-copy

반응형