출처 : http://is.gd/CdaEFG
git am
git 을 사용하면서 format-patch 를 사용하는 경우가 있다.
내 경우에는 여러 개의 패치를 자동으로 적용하려고 할 때, 자주 사용한다. 여러 개의 패치에 대해서 format-patch 를 적용하면 순서대로 번호를 붙여서 patch 파일을 만들어주기도 하고, 적용할 때도 한번의 명령으로 패치를 적용할 수도 있기 때문이다.
> git format-patch <commit>
0001-xxxxxxxxxx.patch
0002-xxxxxxxxxx.patch
0003-xxxxxxxxxx.patch
0004-xxxxxxxxxx.patch
위와 같이 commit 에 해당하는 patch 까지 순서대로 패치 파일을 만들어준다.
이렇게 만들어진 patch 파일을 적용하기 위해서는 git apply 또는 git am 명령을 사용할 수 있다.(http://is.gd/zGCKYU)
git apply 는 기존의 patch 파일 또는 format-patch 로 만든 patch 파일을 모두 사용할 수 있다. 하지만, am 명령은 format-patch 로 만든 patch 파일에 대해서만 적용이 가능하다.
git am 의 장점은 여러 개의 패치파일에 대해서 문제가 없다면 한번에 적용이 가능하다는 것이다.
하지만, 인생이 그렇듯이 항상 우리가 원하는 대로 적용이 잘 되지 않는다는게 함정이다. 아래는 참조사이트에서 인용한 예제이다.
referenced by http://is.gd/CdaEFG
> git am PATCH
Applying: PACTH DESCRIPTION error: patch failed: file.c:137 error: file.c: patch does not apply error: patch failed: Makefile:24 error: libavfilter/Makefile: patch does not apply Patch failed at 0001 PATCH DESCRIPTION When you have resolved this problem run "git am --resolved". If you would prefer to skip this patch, instead run "git am --skip". To restore the original branch and stop patching run "git am --abort".
참조사이트를 찾아서 생각해 본 해결방법 2가지를 소개해 본다.
첫번째 방법
git am 의 경우 어떤 문제가 생겼는지 patch 처럼 알려주지를 않는다.
패치 적용이 잘 안되는 경우에 가장 간단한 방법은 git am 을 취소하고 직접 patch 를 적용하는 방법이다.
$ git am PATCH
(fail)
$ git am --abort
$ patch -p1 < PATCH
(fix)
$ git add FIXED_FILES
$ git commit -a
이렇게 문제를 해결할 경우에는 commit 에 대한 commit message 를 다시 작성해야하고, git am 의 대상이 되는 patch 가 여러개일 경우, 매 패치마다 git am --abort > patch > git add > git commit > commit 메시지 작성등의 작업을 해주어야 한다.
무척 귀찮은 작업이라 적용할 패치가 여러 개인 경우에 좀 더 좋은 방법은 git apply 명령을 활용하는 것이다.
두번째 방법
$ git am PATCH
(fail)
$ git apply PATCH --reject
(fail, .rej 파일 생성됨)
(fix)
$ git am --continue (or --resolved)
(반복)
apply 명령의 --reject 옵션은 patch 명령과 동일하게 rej 파일이 생성되도록 해준다.
이렇게 apply 명령을 활용하면 commit 메시지를 다시 작성할 필요도 없고, 최초에 patch 를 만들었던 author 등 기존 commit 메시지의 정보를 활용하여 반영해준다.
반영을 해주었다면, merge / rebase 등 confilict 이 발생했을 때와 동일하게 수정한 파일을 추가하고, am 을 계속 진행하면 된다.
$ git add <manual modified file>
$ git am --continue
첫번째 방법은 수동으로 하는 방식으로 쉽다고 느낄 수 있으나, 새로 commit 메시지 작업을 해주어야 하고, format-patch 등으로 기존 commit message 를 얻어오는 장점등을 활용할 수 없다.
두번째 방법은 안되면 git am --abort 로 git am 이전으로 돌아갈 수도 있고, 다양한 시도를 해볼 수 있어서 익혀두면 좋은 방법이라고 생각한다.
'IT 기술 > 컴퓨터관리 팁' 카테고리의 다른 글
[리눅스] ls -l 옵션시 file type 을 나타내주는 기호 (0) | 2018.04.17 |
---|---|
[우분투] 바탕화면 관리 프로그램 Variety (0) | 2015.09.13 |
[TotalCommand] 설정 파일 경로 변경 (0) | 2015.01.24 |
[윈도7] 장치 및 프린터 항목이 나타나지 않는 경우 (1) | 2014.11.12 |
[Vim] vi 가 너무 느리게 열리는 경우.. (vim.gnome 과 vim.basic) (0) | 2014.08.05 |