quilt로 관리하던 패치 세트를 Git 저장소로 옮길 때, 흔히 patches 디렉터리를 하나씩 quilt push로 적용하고 그때마다 git add -u, git commit을 반복하는 방법을 쓴다. 패치가 몇 개 안 되면 괜찮지만, 수십 개짜리 패치 세트라면 이 수작업은 지루하고 커밋 메시지를 빠뜨리거나 순서를 꼬이게 만들기 쉽다. Git에는 이 변환을 한 번에 처리하는 git quiltimport라는 내장 명령이 있는데 의외로 잘 알려져 있지 않다. 이 글에서는 git quiltimport로 quilt 패치 세트를 한 번에 Git 커밋으로 변환하고, 다시 메일 제출용 패치로 뽑아내는 과정과 이를 스크립트로 자동화하는 방법을 정리한다.
사전 준비
quilt 패치 세트가 정리되어 있어야 한다. patches/ 디렉터리 안에 .patch 파일들과, 적용 순서를 정의하는 series 파일이 있어야 한다.
$ ls patches/
series
fix-driver-logging.patch
add-new-feature.patch
update-docs.patch
$ cat patches/series
fix-driver-logging.patch
add-new-feature.patch
update-docs.patch
git quiltimport는 quilt로 패치가 이미 적용된 상태를 요구하지 않는다. 패치 파일과 series 목록을 직접 읽어서 스스로 적용하고 커밋까지 만든다. 오히려 quilt로 push해서 이미 적용해 둔 소스 트리 위에서 실행하면, 같은 변경을 다시 적용하려다 충돌이 날 수 있다. 그래서 quilt와 병행 관리 중이었다면 quilt pop -a로 패치를 전부 되돌려 원래(base) 상태로 만든 뒤 실행하는 게 안전하다.
git quiltimport로 한 번에 변환하기
기존 코드에 영향을 주지 않도록 전용 브랜치를 만든 뒤 실행한다.
git checkout -b import-from-quilt
git quiltimport -p 1 --series patches/series
-p 1은 패치 파일 경로 앞의 a/, b/ 접두어를 무시하도록 지정하는 옵션이다. 실행하면 series에 나열된 순서대로 각 패치가 Git 커밋으로 만들어진다. 커밋 메시지는 패치 파일의 Subject: 헤더에서 자동으로 가져오고(없으면 파일명을 그대로 쓴다), author 정보도 패치 헤더에서 찾는다. 헤더에 author 정보가 없다면 --author "이름 <이메일>"로 기본값을 지정해줘야 한다. 실제로 적용하기 전에 --dry-run(-n)으로 먼저 검사해보면, author 정보가 빠진 패치가 있는지 미리 경고를 받을 수 있다.
$ git quiltimport --dry-run --series patches/series
$ git log --oneline
series 파일의 순서가 곧 커밋 순서이므로, 커밋 순서를 바꾸고 싶다면 quiltimport를 실행하기 전에 series 파일 자체를 수정하면 된다.
format-patch로 다시 메일용 패치 만들기
Git 커밋으로 변환된 걸 메일링 리스트 제출용 패치로 다시 뽑아낸다.
git format-patch origin/master
origin/master를 기준으로 새로 추가된 커밋들을 0001-...patch, 0002-...patch 형태의 파일로 만들어준다. 변환 후 커밋 메시지를 다듬거나 여러 커밋을 합치고 싶다면 git rebase -i로 정리할 수 있다.
자동화 스크립트로 묶기
위 과정을 quilt_to_gitpatch.sh로 묶어두면 매번 손으로 반복하지 않아도 된다.
#!/bin/bash
# quilt_to_gitpatch.sh
# quilt 기반 패치 세트를 git format-patch 형식으로 자동 변환
set -e
PATCH_DIR="patches"
BASE_BRANCH="origin/master"
WORK_BRANCH="import-from-quilt"
# 1. 브랜치 생성
echo "[1/4] 새 브랜치 생성: $WORK_BRANCH"
git checkout -B "$WORK_BRANCH" "$BASE_BRANCH"
# 2. quilt 패치 세트 확인
if [ ! -f "$PATCH_DIR/series" ]; then
echo "Error: $PATCH_DIR/series 파일이 없다"
exit 1
fi
# 3. quiltimport 실행
echo "[2/4] quilt 패치 세트를 Git 커밋으로 변환 중..."
git quiltimport -p 1 --series "$PATCH_DIR/series"
echo "[3/4] 변환된 커밋 목록:"
git log --oneline "$BASE_BRANCH"..HEAD
# 4. format-patch 생성
echo "[4/4] format-patch 생성 중..."
git format-patch "$BASE_BRANCH" -o ./out_patches
ls ./out_patches
chmod +x quilt_to_gitpatch.sh
./quilt_to_gitpatch.sh
patches/ 디렉터리와 series 파일이 현재 디렉터리에 있어야 하고, 실행이 끝나면 out_patches/ 폴더에 .patch 파일들이 생성된다. BASE_BRANCH를 인자로 받게 바꾸면 여러 기준 브랜치에 재사용할 수 있고, 필요하면 git send-email 호출을 추가해 제출까지, 혹은 사내 CI 환경(Jenkins 등)의 자동 변환·검증 파이프라인으로도 확장할 수 있다.
주의사항
- quilt로 이미
push해서 패치가 적용된 소스 트리 위에서 바로git quiltimport를 돌리면 같은 변경이 중복 적용되며 충돌할 수 있다. 반드시quilt pop -a로 되돌리거나, 패치가 적용되지 않은 깨끗한 트리에서 실행한다. - 커밋 메시지와 author 정보는 패치 파일의 헤더에서 그대로 가져온다. 헤더에
Subject:나 author 정보가 없는 패치라면 커밋 메시지가 파일명으로 대체되거나 author가 비어 실행이 막힐 수 있으니,--dry-run으로 먼저 확인하는 걸 권장한다. - 변환 순서는
series파일 순서를 그대로 따른다. 커밋 순서를 바꾸고 싶으면 quiltimport 실행 전에series파일부터 수정해야 한다.
마무리
git quiltimport는 quilt 패치 세트를 Git 커밋으로 바꾸는 과정에서 패치 경계·순서·설명(author, subject)까지 그대로 보존해준다는 점에서, 패치마다 push·commit을 수동으로 반복하는 것보다 훨씬 안전하고 빠르다. 스크립트로 묶어두면 새 패치 세트가 들어올 때마다 브랜치 생성부터 변환, 재제출용 패치 생성까지 한 번에 끝낼 수 있다.