Subversion으로 부분 커밋


104

예를 들어 하나의 파일 에서 두 개의 독립적 인 변경 을 수행 경우 새로운 방법을 추가하고 다른 방법을 변경했습니다.

나는 종종 두 가지 변경 사항을 하나의 커밋 으로 커밋하지 않고 두 개의 독립적 인 커밋으로 커밋 하고 싶습니다 .

git 저장소 에서 git-add (1)대화 형 모드 를 사용 하여 덩어리 를 더 작은 것으로 분할합니다 .

 git add --patch

Subversion으로이 작업을 수행하는 가장 쉬운 방법은 무엇입니까? (이클립스 플러그인을 사용할 수도 있음)

업데이트 :
힘내 소개 살아라는 , 라이언를 호출합니다 . "얽힌 작업 복사본 문제"


명령 줄에서 특별히 솔루션을 찾고 있었습니까? 아래의 많은 응답은 Tortoise 전용 기능인 TortoiseSVN '커밋 후 복원'을 언급하므로 GUI 및 Windows 기반입니다.
florisla

답변:


35

git-svn을 사용하면 원격 SVN 저장소의 로컬 GIT 저장소를 만들고 전체 GIT 기능 세트 (부분 커밋 포함)를 사용하여 작업 한 다음 모두 SVN 저장소로 푸시 할 수 있습니다.

git-svn (1)


25
이 솔루션에는 특별한 아이러니가 있습니다.
tuxayo

65

Tortoise SVN 1.8은 이제 "커밋 후 복원"기능으로이를 지원 합니다. 이렇게하면 커밋 후 모든 편집 내용이 취소되어 파일을 편집 할 수 있습니다.

문서에 따라 :

특정 문제와 관련된 파일 부분 만 커밋하려면 :

  1. 커밋 대화 상자에서 파일을 마우스 오른쪽 버튼으로 클릭하고 "커밋 후 복원"을 선택합니다.
  2. 예를 들어 TortoiseMerge에서 파일을 편집하십시오 : 아직 커밋하고 싶지 않은 변경 사항을 취소하십시오.
  3. 파일 저장
  4. 파일을 커밋

어떻게 작동하는지 궁금합니다. 나는 확인 SVN 1.8 릴리스 노트를 ,하지만 난 "후 커밋 복원"을 기반으로 기능을 알아낼 수 없습니다.
DavidS

3
@DavidS 이것은 SVN의 기능이 아닙니다. TortoiseSVN의 기능입니다.
florisla

참고로, SVN 1.8은 2018 년 4 월부터 1.10 출시와 함께 EOL입니다
Greg K

여기 문서에서도 찾을 수 있습니다 : tortoisesvn.net/docs/release/TortoiseSVN_en/…
Guillaume Husta

42

TortoiseSVN을 사용하여이 작업을 수행했습니다 .

내장 된 병합 유틸리티를 사용하면 저장소 버전과 작업 복사본 간의 차이를 표시 할 수 있습니다.

(가) 사용하여 백업 생성 은 diff 유틸리티의 기능을

  1. 모든 변경 사항을 커밋하려는 것처럼 파일을 커밋하십시오.
  2. 커밋 창에서 파일을 두 번 클릭하여 diff를 표시합니다.
  3. diff 설정에서 원본 파일 백업 옵션을 클릭 합니다 .
  4. 원하지 않는 변경 사항을 마우스 오른쪽 버튼으로 클릭하고 다른 텍스트 블록 사용 선택을 사용합니다 .
  5. diff를 정확히 한 번 저장하십시오 . 저장할 때마다 백업을 덮어 씁니다. 이것이 한 번만 저장하려는 이유입니다.
  6. 변경 사항을 적용하십시오.
  7. 생성 된 .bak 파일로 원본을 덮어 씁니다 (원본 변경 사항이 모두 포함됨).
  8. 파일을 커밋하십시오.

이제 두 개의 개별 커밋을 사용하여 모든 변경 사항을 커밋해야합니다.


1
정확히 어떻게 한 거죠? 나는 그 기술을 배우는 데 관심이 있습니다.
Lasse V. Karlsen

커밋 후 .bak 파일로 자동으로 덮어 쓰면 매우 깔끔 할 것입니다.
BCS

3 단계를 찾지 못했습니다 : 백업 옵션, Tortoise SVN 1.8.1 사용
sudhAnsu63

4
신경 쓰지 마. 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html에 대한 핵심 응답 링크를 찾았습니다. 특정 문제와 관련된 파일 부분 만 커밋하려면 : 커밋 대화 상자에서 파일을 마우스 오른쪽 버튼으로 클릭하고 "커밋 후 복원"을 선택하여 파일을 편집합니다. 예 : TortoiseMerge : 커밋하고 싶지 않은 변경 사항을 취소하고 파일을 저장합니다. 파일 커밋
sudhAnsu63

안타깝게도 이것은 Tortoise 버전 1.8.5에서 사용할 수없는 것으로 보이며 "커밋 후 복원"도 아닙니다.
kajaco

24

사용 svn diff > out.patch을 시도한 다음 out.patch파일을 out.patch.addout.patch.modify

당신은 작업 패치 파일이있는 경우에만 사용하여 원본 파일 되돌리기를 svn revert out.c.

추가 또는 수정을위한 덩어리 만 포함하도록 패치 파일을 직접 편집하십시오 . patch명령을 사용하여 원본 파일에 적용하고 추가가 작동하는지 테스트 한 다음 svn commit추가합니다.

out.patch.modify패치를 위해 헹굼을 반복 하십시오.

초기 질문에 명시된대로 변경 사항이 파일에서 분리 된 경우-새 방법 추가, 기존 방법 변경-작동합니다.

이것은 매우 지루한 솔루션입니다. 커밋을 분리 할 이유가 있어야한다고 확신하지는 않지만.

작업을 적용하기 위해 동일한 소스의 여러 작업 사본을 체크 아웃 할 수도 있습니다.

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

에 반드시 svn up모든 것이 잘 확실하게 테스트.


11

이것은 v1.8부터 TortoiseSvn (Windows)을 사용하여 가능합니다.

4.4.1. 커밋 대화 상자

작업 복사본이 최신 상태이고 충돌이없는 경우 변경 사항을 커밋 할 준비가 된 것입니다. 커밋하려는 파일 및 / 또는 폴더를 선택한 다음 TortoiseSVN → 커밋 ...

<스닙>

4.4.3. 파일의 일부만 커밋

파일에 대한 변경 사항의 일부만 커밋하려는 경우가 있습니다. 이러한 상황은 일반적으로 작업 중이지만 긴급 수정을 수행해야 할 때 발생하며 해당 수정은 작업중인 파일과 동일한 파일에 있습니다.

파일을 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴 → 커밋 후 복원을 사용하십시오. 파일의 복사본이있는 그대로 생성됩니다. 그런 다음 TortoiseMerge에서 파일을 편집하고 커밋하지 않으려는 모든 변경 사항을 취소 할 수 있습니다. 이러한 변경 사항을 저장 한 후 파일을 커밋 할 수 있습니다.

커밋이 완료되면 파일의 사본이 자동으로 복원되고 다시 커밋되지 않은 모든 수정 사항이 포함 된 파일을 갖게됩니다.

Linux에서는 http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php 를 사용해 보겠습니다. 그래도 직접 시도하지 않았습니다.


8

나는 이것을 사용했다 :

  • 내 편집기 (저는 vim 사용)에서 변경 사항 중 하나만 나타나도록 파일을 편집합니다.
  • 파일 저장 (하지만 편집기를 종료하지 마십시오)
  • 변경된 파일을 svn에 커밋
  • 두 번째 변경 사항 세트가 다시 나타날 때까지 편집기에서 "실행 취소"를 충분히 누르십시오.
  • 파일을 다시 저장하십시오.
  • 두 번째 변경 사항을 커밋합니다.

이는 한 세트의 변경 사항을 실행 취소하기가 합리적으로 쉽다고 가정하는 단순한 접근 방식입니다. 더 복잡한 상황에서는 걱정하지 않고 두 가지 변경 사항을 모두 포기하고 커밋합니다.

이제 git을 사용하므로 다시는 할 필요가 없을 것입니다!


4

로컬 darcs 리포지토리를 사용하거나 변경 사항을 점차적으로 병합합니다. 병합 (opendiff는 Xcode와 함께 제공되는 병합 프로그램 인 FileMerge를 엽니 다. 선호하는 병합 도구로 대체) :

cp file file.new
svn revert file
opendiff file.new file -merge file

관련 변경 사항을 병합하고, 병합을 저장하고, 병합 프로그램을 종료합니다.

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

파일에 관련없는 덩어리가 두 개 이상 있으면 헹구고 반복합니다 (하지만 커밋하기 전에 왜 그렇게 오래 기다리겠습니까?!)

또한 git을 알고 있다면 git-svn 을 사용 하여 로컬 git repo를 유지하고 커밋을 svn 마스터 서버에 동기화 할 수 있습니다. 제한된 경험에서 훌륭하게 작동합니다.


9
Re : "왜 그렇게 오래 기다려?" 당신은 하루 종일 큰 리팩토링을하고 보스는 점심 식사 직전에 버그를 수정합니다.
BCS

4

Visual Studio 용 VisualSVN을 사용해보십시오 . 최신 6.1 버전은 QuickCommit 기능을 소개합니다. Visual Studio 편집기에서 새로운 이 블록 커밋선택 커밋 컨텍스트 메뉴 명령을 사용하여 파일에서 선택한 변경 내용을 부분적으로 커밋 할 수 있습니다 .

여기에 이미지 설명 입력


2
  1. 선택한 편집기에서 분할하려는 모든 파일을 엽니 다.
  2. 다른 도구 세트 (Win에서는 Spike의 제안 (이전 버전) 사용)를 사용하여 두 번째 세트를 제거합니다.
  3. 범하다
  4. 선택한 편집기로 돌아가서 모든 파일을 저장하십시오.

Spike의 전체 제안보다 약간 위험하지만 수행하기가 더 쉬울 수 있습니다. 또한 일부 편집자는 해당 파일을 다시로드하지 않는 한 (모든 변경 사항이 손실 됨) 아래에서 변경된 파일을 저장하는 것을 거부하므로 먼저 다른 작업을 시도하십시오.


0

diff 파일 생성, 되돌리기 등보다 쉬운 옵션은 저장소의 두 복사본을 체크 아웃하고 DeltaWalker와 같은 시각적 diff 도구를 사용하여 덩어리를 하나에서 다른 것으로 복사하는 것입니다.

첫 번째 사본은 실제로 작업하는 사본이고 두 번째 사본은이 목적을위한 것입니다. 첫 번째 부분을 엄청나게 변경 한 후에는 한 섹션을 두 번째 섹션으로 복사하고, 커밋하고, 다른 섹션을 복사하고, 커밋 할 수 있습니다.


0
  1. 관련된 모든 수정 된 파일을 백업 복사본에 복사합니다.
  2. 를 사용하여 작업 상태의 패치를 만듭니다 svn diff.
  3. 를 사용하여 파일을 되돌 svn revert립니다.
  4. patch도구 를 사용 하거나 수동 편집 등 을 통해 커밋하려는 패치 부분을 다시 적용하십시오 .
  5. diff나중에 실행 하여 작업 복사본을 백업과 비교하여 패치 부분을 올바르게 적용했는지 확인하십시오.
  6. 빌드하고 테스트합니다.
  7. 범하다.
  8. 백업 사본을 저장소 체크 아웃으로 다시 복사하십시오.
  9. 완료 될 때까지 2. (1이 아님!)에서 반복하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.