Git-AM
using log instead of format-patch
1. Synopsis
A 라는 repo 에서 작업 중이 던 일부 파일들을 B 라는 repo 로 옭겨야 하는 일이 생겼다. 보통git format-patch
와 git am
조합을 많이 사용하는데 내가 원하는 patch 파일의 조건은 딱 하나 였다.
머지 커밋은 가져오고 싶지 않다. ❌
format-patch 의 옵션으로는 요구 사항을 만족할 수 없기 때문에 구글링 하던 참에 git log
커맨드로 원하는 성격의 패치 파일 만들 수 있는 코드조각을 발견했다.
2. Thank you tsayen!
여기서 --no-merges
옵션으로 변경하면 내가 원하는 패치 파일이 된다.
# source repo
git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --no-merges -- ../module > /c/work/module.patch
# target repo
git am --committer-date-is-author-date < /c/work/module.patch
3. git clean 의 존재 😲
git am
으로 가져오게 되면 기존 repo 의 폴더 구조를 그대로 가져 온다. 내가 원하는 위치로 이동 시킨 후 이를 삭제하려고 하면 아래 에러를 뿜는다.
fatal: pathspec ‘some folder/file’ did not match any files
내가 지우려고 하는 파일이 pathspec 에 없다고? 이때 사용할 수 있는 커맨드가 바로 git clean
이다. 버전 관리를 받지 않는 파일을 제거 하여 트리를 정리해주는 커맨드 인데 기본적으로 재귀 탐색하지 않는다.
내 목적은 재귀 탐색하여 강제 삭제였기 때문에 git clean -df
를 사용해 원하는 폴더 구조로 옮긴 뒤 잔여물을 깨끗히 삭제 할 수 있었다.