2014-03-28 2 views
4

을 사용하여 실제 커밋으로 변환 할 시간을 결정하기 전에 패치를 사용하여 코드를 관리하고 있습니다. ((!) 참고 : 예, 알아요, StGit 패치는 실제로 단지 후드 아래 커밋)StGit에서 패치를 분할하는 방법?

가 그럼 난, 단일 StGit 패치에 코드의 많은 양을 추가했지만 지금은 작은 패치로 분할 할 (나중에 더 작은 커밋으로). 어떻게해야합니까? 지금까지

$ vim foobar.ext 
Then I modify both functionA and functionB inside this file. 
This might require changes in other files as well. 
$ stg new large-patch 
$ stg refresh 
$ stg series 
> large-patch 

$ [insert here the answer to this question] 

$ stg series 
+ functionA-changes 
> functionB-changes 
$ 
+0

이 토론 (및 솔루션)은 다음과 유사합니다 : https://www.mail-archive.com/stgit-users%40gna.org/msg00067.html – MarcH

답변

1

내 솔루션 :

$ stg pop 
Popped large-patch 
No patch applied 

$ stg show large-patch | patch -p1 

$ git add -p 
Here I interactively select which portions are going to be staged. 

$ stg new functionA-changes 
$ stg refresh --index 

$ stg new functionB-changes 
$ stg refresh 

$ stg push 
Pushing patch "large-patch" ... done (empty) 
Now at patch "large-patch" 

$ stg delete large-patch 
Deleted large-patch (empty) 
Now at patch "functionB-changes" 

다른 방법이있다는 :

$ stg pop 
Popped large-patch 
No patch applied 

$ stg show large-patch > foobar.patch 
$ vim foobar.patch 
Manually edit the patch 
$ patch -p1 < foobar.patch 
Now the files only have the changes from functionA. 

$ stg new functionA-changes 
$ stg refresh 

$ stg rename large-patch functionB-changes 
$ stg push 
Pushing patch "functionB-chages" ... done 
Now at patch "functionB-chages" 

그것은 작동하지만, 여전히 약간의 문제가된다. 더 나은 해결책이 있는지 나는 모른다.

+0

'patch p1'은 (는)'patch -p1'이어야합니다. 첫 번째 해결책? –

+0

@DrewMcGowen, 확실! 그것을 지적 주셔서 감사합니다! –

4

이렇게하는 방법에는 여러 가지가 있습니다. 작은 피스에서 패치 자체를 깨거나 하단 또는 상단에서 패치의 일부를 선택할 수 있습니다.

옵션 1 :

$ stg delete large-patch --spill 

### for each patch i in 0..N-1: 
$ stg new sub-patch-$i 
$ git add -p . 
$ stg refresh --index 

옵션 2 : 패치 자체를 분할

$ stg pop large-patch 

### for each patch i in 0..N-1: 
$ stg new sub-patch-$i 
$ git checkout -p $(stg id large-path) 
$ stg refresh 

$ stg push large-patch 

옵션 3 : 바닥에서 선택의 상단에서 선택 :

$ stg refresh 
$ git reset HEAD~1 -p 
$ stg refresh -i 
$ stg new new-top-patch 
$ stg refresh 

이를 세 번째 옵션 (상단에서)은 매우 편리하지만 더 복잡합니다. 변경 사항을 역방향으로 선택합니다. git reset으로 끝내면 인덱스에서 변경 한 내용이 패치의 변경 사항을 되돌 리며, 작업 트리의 변경 사항은 되 돌린 변경 사항을 되돌려 놓아 효과적으로 변경 사항을 적용한 새 패치를 작성합니다.

+0

stg delete - 패치 내용을 색인에 그대로 둡니다. 그래서 당신은 여기에 자식 재설정을 놓친거야 stg 삭제 후 그냥 생각합니다. – goedson