커널 소스를 수정하다 보면 아직 업스트림에 올리지 않은 패치 여러 개를 순서대로 관리해야 하는 경우가 많다. quilt만 쓰면 패치 적용 순서는 관리되지만 이력 추적이 약하고, Git만 쓰면 커밋 이력은 남지만 패치 단위로 적용/해제를 반복하기 번거롭다. 이 글에서는 Git 브랜치로 작업 이력을 관리하면서 그 위에 quilt로 패치 단위 작업을 얹는, 커널 개발자들이 자주 쓰는 워크플로를 정리한다.
Git 브랜치 준비
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout -b my-feature
- 새로운 기능이나 수정 작업을 위한 브랜치를 만든다.
my-feature브랜치에서 패치 작업을 진행한다.
quilt 초기화
quilt init
.pc/디렉터리와patches/디렉터리가 생성된다.series파일이 패치 순서를 관리한다.
Git과 quilt 연동 설정
export QUILT_PATCHES=patches
export QUILT_SERIES=series
- 환경 변수를 설정해
quilt이 패치 파일을 저장할 위치를 명시한다. .bashrc나.zshrc에 추가해두면 매번 설정할 필요가 없다.
새 패치 생성 및 수정
quilt new fix-driver-logging.patch
quilt add drivers/net/ethernet/intel/e1000/e1000_main.c
vi drivers/net/ethernet/intel/e1000/e1000_main.c
quilt refresh
- 수정할 파일을 추가하고, 변경 후
refresh로 패치를 저장한다. patches/fix-driver-logging.patch파일이 생성된다.
Git에 패치 파일 커밋
git add patches/series patches/fix-driver-logging.patch
git commit -m "Add patch: fix-driver-logging"
quilt이 만든 패치 파일을 Git에 커밋한다.- 이렇게 하면 Git은 패치 파일 자체를 추적하고,
quilt은 실제 코드 변경을 관리한다.
패치 적용/해제 테스트
quilt pop -a
quilt push -a
- 패치가 정상적으로 적용되고 되돌릴 수 있는지 확인한다.
- 문제가 생기면
quilt edit으로 수정 후 다시refresh한다.
Git과 quilt 병행 관리
- 새로운 패치를 추가할 때마다
quilt new→add→refresh→git commit순서로 반복한다. - Git은 패치 파일의 버전을 관리하고,
quilt은 패치의 적용 순서와 내용을 관리한다.
최종 패치 세트 생성
quilt pop -a
quilt push -a
quilt series
- 모든 패치가 적용된 상태를 확인한 뒤,
patches/디렉터리의 패치 세트를 그대로 배포하거나 메일로 제출할 수 있다.
메일용 패치 생성 (선택)
quilt mail -m "Fix driver logging issue"
- 커널 메일링 리스트에 보낼 수 있는 형식의 패치를 생성한다.
- 또는
git format-patch로 Git 커밋 기반 메일을 만들 수도 있다.