[완료] Subversion (svn)의 충돌 해결에 관한 질문

sisuc의 이미지

안녕하세요-

svn에 대해 궁금한점이 있어 이렇게 글을 남깁니다.

제가 오늘 svn을 이용해

#svn update를 실행 했습니다

그런데 2가지 문제점이 발생 하였습니다.

1: abc.jpg 파일을 추가 할 수 없습니다. 동명의 오브젝트가 이미 존재합니다
(일본어를 한글로 번역한거라 정확한 한글 메세지 인지 어떤지는 모르겠습니다)

1의 대처 방법으로 abc.jpg를 삭제하고 다시 한번 svn update를 실행했더니 위와 같은 메시지가 나오지는 않았습니다. 문제없이 update되었습니다.
그런데 궁금한점은 저런 처리 방법이 옳은것인지 아닌지를 알고 싶고 만약 더 좋은 방법이 있다면 알려주시길 바랍니다.

2: C 메시지 입니다. 위의 오브젝트 존재 처리를 하고 update를 했더니 많은 파일들이 A U D G 상태를 나타내고, 또한 C메시지도 있었습니다. 저는 제가 수정한 것을 버리고 repository의 변경사항을 제 작업환경에 반영하고 싶습니다.
꽤 많은 파일이었기에 충돌 파일이 많은 디렉토리에서는

#svn revert ./*

를 실행시켜 전부 revert했습니다.

그런제 여기서 질문입니다.

지금 현재의 상황에서

위와 같은 경우 repository의 변경사항이 제대로 적용 되었는지, 아니면 repository는 무시하고 제가 변경한걸로 변경되었는지 하는 의문점이었습니다.

만약 제대로 된 처리 방법이었다면 문제가 없지만 repository의 환경을 그대로 적용하고 싶은데 충돌상황에서 repository의 변경을 받아 들이고 싶을 때 할 수 있는 대응 방법을 알고 계시면 가르쳐 주시길 부탁드립니다.

*추가 질문입니다.

변경이 충돌 할 시 그 파일에 대한 3개의 파일이 추가되는데 revert명령어로 처리 했을 시에 그 파일들이 사라지더군요
그럼 [svn resolved 파일명] 해서 이걸 실행해줘야 하나요? svn 메뉴얼 보니까 충돌을 처리했다는걸 svn에 알려줘야 한다고 했는데
일일이 다 해주기도 뭐하고 해서 정말 해줘야 하는건지 하는 의문점이 듭니다. (그 메뉴얼이 2005년도에 작성된 문서였기에)

긴 글 읽어 주셔서 감사합니다.

klenui의 이미지

저보다 잘하시는 분들도 많습니다만.. 제가 아는 범위에서 적어보면...

1번. 현재 리비젼에서 로컬에 없던 파일을 업데이트 하면서 가져오려는데 파일이 이미 있다..고 하면
로컬 파일 이름을 변경하든가 해서 충돌하지 않게 하는게 정답입니다. 기존 파일을 꼭 반영해야 겠다고 하면 이름 변경하여 백업한 후 update하고 백업해둔 파일을 다시 덮어쓰면 되겠지요..

2번. revert를 하면 작업중이던 리비전에 해당하는 서버와 동일한 내용으로 변경됩니다. revert를 했다면 해당 리비전에 관한 한 서버와 내용이 동일해 졌다고 보시면 됩니다.

추가. 내가 로컬 수정한 후, 다른 사람이 서버에 수정을 반영했고, 두 작업 결과물이 diff기반의 자동 merge를 할수 없는 상황이 되면 conflict가 발생합니다. 이때 현재 파일, 작업중이던 리비전 파일, 최근 리비전 파일등이 따로 생성됩니다. 세 파일을 참조해서 수작업 merge 진행한 후 resolved로 지정하면 수작업 머지를 했으니 현재 파일이 최종이다..라고 svn에 알려주게 됩니다. resolve한 후 commit하면 수작업 결과물이 서버에 반영됩니다. revert를 해버리면 작업하신 내용들이 사라지고 서버 내용과 동일해 지므로, conflict 상황이 아니게 됩니다.

문의하신 내용들은 subversion 내부 동작을 이해하면 어떻게 보면 당연할 수 있는 부분들이라고 생각됩니다. 조금 번거로우시더라도 매뉴얼 일독을 권해드립니다.

sisuc의 이미지

메뉴얼을 읽었는데 이해를 못해서 검색을 해봤는데도

revert의 기능에 대한 말들이 서로 달라 더 헷갈려서

직접 질문을 드리게 되었습니다.

결국 저는 지금 repository와 같은 환경이 되었군요. 이것으로 일단 안심했습니다.

svn update를 했을 때 충돌이 났을 경우에 문제가 되는 경우는

"어..? 내가 수정한 것도 필요한데"

라고 느낄때 라고 생각합니다

전 그런건 없고 거의 받아 쓰는 입장이기 때문에

update한 후, 충돌에 대해 revert를 했는데 제대로 안받아졌나 해서 불안했거든요.

여기서 다시 질문이 생깁니다.

svn update를 한 시점에서

이미 svn은 내 로컬에다가 repository의 결과물을 전부 다운로드? 한 후

그 후에 현재 내 리비전과 비교해서 스탯상황을 알려주는 건가요?

그러니까 만약 저 경우라면 revert도 이해가 갑니다.

저는 이제까지 revert하면 repository와 통신해서 실시간으로 다운받는 줄 알았더니 아니더군요.

그리고 svn update를 하면 실시간으로 하나하나 비교하면서 다운하는줄 알았는데 그게 궁금하군요..

미리 다 다운받아놓고 로컬과 비교를 하는것인지.. 이 경우라면 revert로 충돌해결하는것이 이해가 갑니다.

예:) 현재 나의 revision 5
repository의 revision 6

svn update 한 시점에 내 작업환경에 revsion6 결과물이 생성된다 통신은 이 시점에서 끝.

그후 파일들의 revsion5 와 6을 비교해 상황을 보고한다

A 123.txt
D qwe.gif
U asdf.xls
C abc.jpg

위의 경우 #svn revert abc.jpg

할 경우 revsion6의 결과물로 대체된다

인가요..?

그리고 이 경우는

#svn resolved abc.jpg

를 안해줘도 되나요?

만약 이게 아니라면 svn update를 할 때 실시간으로 통신을 하면서 비교를 해서 스테이터스를 보고하는건지..

이 경우 revert를 하면 revision5의 결과로 되는건 아닌지(revert는 통신을 하지 않음으로)

메뉴얼을 보세요 라고 하면 할말은 없지만 느긋이 볼 수도 없는 상황이라서..

위대한 한글

위대한 한글

klenui의 이미지

suversion 작업 디렉토리를 보시면 .svn 이라는 숨은 디렉토리가 하나 있습니다.
그 디렉토리안에 checkout할때의, 그리고 최종 update했을 때의 정보가 들어있게 됩니다.

제가 아는 범위에서 revert는 최종 update 했던 시점으로 돌리는 것으로 알고 있습니다.

위 예에서 update를 하면서 .svn의 abc.jpg 파일 리비전이 6으로 올라갔기 때문에 abc.jpg가 revision 6으로 revert되지 않을까 생각합니다만
테스트가 필요할 것 같네요.. 평상시에 거의 의식하지 않고 써와서 굳이 따지자면 긴가민가 합니다.
확인하고 싶으시면 "svn info abc.jpg" 해보시는 게 가장 확실하겠지요..

klenui의 이미지

Revision 112 파일을 가지고 테스트를 해보니
conflict는 발생했지만 Revision 116으로 revision 숫자는 올라갔네요..
그리고 revert를 하니 revision 116으로 되는 것을 확인했습니다.

svn 1.5.4에서 확인한 내용인데, 버전별로 다를수도 있으니 확인하시는 게 안전할겁니다.

sisuc의 이미지

직접 테스트 까지 해주시고..^^;

정말 감사드립니다 궁금증이 확 풀리네요-

정확한 구조는 좀 더 공부해 볼 필요가 있겠네요..

감사합니다

위대한 한글

위대한 한글

charsyam의 이미지

배타락을 쓰는 경우가 아니라면 충돌은 일어날 수 밖에 없습니다.

그렇다면, 그 충돌이 일어났을 때, 피해가는 것이 아니라, 그 때 그 때 제대로 수정하는 것이 옳다고 생각합니다.

뭐, 다음과 같은 규칙을 정해서 대체적으로 피할 수 도 있습니다.

1. 대도록이면 같은 파일에 동시에 작업 안하기
- 같은 함수나 위치에서만 안하면 대부분 피할 수 있습니다.

그렇다면 충돌이 일어났을 때는 어떻게 하는가?

diff 로 충돌이 일어난 부분을 보고, merge를 해야 합니다.

충돌이 일어났다는 것은 같은 부분에 수정이 있었다라는 얘기이니깐요.

파일이 세 개 생기는 것은, 자신이 체크아웃한 버전, 상대방이 체크한 버전, 현재 버전
뭐, 그런거인데,

그걸 보고 winmerge 나 merge 툴을 이용해서 merge 한 다음

resolve를 해서 충돌 해결을 보고 하고

그 때 커밋을 하면 됩니다.

매번 Revert를 하는 건, 자신의 작업을 잃어버릴 수 있으므로 위험합니다.
=========================
CharSyam ^^ --- 고운 하루
=========================

=========================
CharSyam ^^ --- 고운 하루
=========================

sisuc의 이미지

근데 아직까지 나오지 않은 답변이 있는데

revert해서 충돌 해결을 했을 경우

resolved 할 필요는 없나요? 꼭 해야되나요?

merge로 손수 충돌 해결을 했을 경우만 resolved하는건지

(revert한 시점에서 파일 생성되었던 3개는 다 사라지더라고요)

위대한 한글

위대한 한글

charsyam의 이미지

resolve 안해도 됩니다.

revert 가 이미 이전 버전으로 되돌린다라는 의미이므로, 수정 자체가 없어졌으니, 충돌자체가 없었다라는게 되겠죠.
=========================
CharSyam ^^ --- 고운 하루
=========================

=========================
CharSyam ^^ --- 고운 하루
=========================

sisuc의 이미지

답변 감사드립니다. ㅎ

위대한 한글

위대한 한글

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.