티스토리 뷰

상태

어떤 프로젝트에 기생하는 폴더가 하나 있다. 여하한의 이유로 그 폴더가 분리되지 않은 채 있었고, 변경이력이 장기간 쌓여 왔다. 이젠 새로운 저장소로 해당 폴더만 이관하고 싶다.

아이디어

  • "git log" 명령으로 특정 파일들 또는 폴더만 지정하여 해당 경로에 영향을 준 커밋만 뽑을 수 있다.
  • "git log" 명령에는 커밋의 diff 를 출력해 볼 수 있는 "--patch" 옵션 (또는 줄여서 -p)이 있다.
  • "git log" 명령에는 binary의 변경 또한 출력할 수 있는 "--binary" 옵션이 있다.
  • "git rebase" 명령의 내부에서는 일련의 변경 이력을 replay하는 방법으로 구현된다.
  • "git am" 명령이 "git rebase" 내부에서 동작하는 방식이며, 포맷은 무려(!) 이메일 포맷이다.
  • "git log" 명령에는 이메일 형식으로 변경을 출력할 수 있는 "--format=email" 옵션이 있다.
  • "git am" 명령은 날짜가 오래된 커밋이 맨 앞에 나온다.
  • "git log" 의 결과로 날짜가 오래된 것을 먼저 보이려면 "--date-order", "--reverse" 로 가능하다.

예제

specific_dir 이라는 디렉토리의 변경 사항을 꺼내어 project2 를 만드는 예제이다. 

$ cd ~/work/project1
$ git log --date-order --reverse --binary --patch --format=email -- specfic_dir > 1.eml
$ cd ~/work
$ mkdir project2
$ cd project2
$ git init
$ git am ~/work/project1/1.eml

여기서의 제약이라면, "git log --graph -- specific_dir" 명령으로 확인했을 때, 단일 브랜치여야한다. 평소에 merge commit 을 쓰지 않고, fast forward 전략으로 브랜치를 관리하였다면, 어려움 없이 모든 커밋을 떼어 낼 수 있다.

가끔 1.eml 내부의 커밋이 비어 있는 경우도 있을 수 있고, "git am"은 그것에 대해 블평하며, 작업을 중단한다. 그때는 "git am --skip" 으로 넘기면 된다.

Tip 1

git apply 혹은 git am 의 --whitespace 옵션은 적용하는 소스에 trailling white space 가 있을 경우 error 로 취급하는 것이 기본 값이다. 따라서 적용도중

NNN: trailing whitespace.

몇 번째 줄에 이런 오류가 있어서 진행이 멈춘 경우 진행 된 것을 수작업으로 걷어 내고 git am --whitespace=nowarn 과 같이 옵션을 추가하여 진행한다. (비슷하게 git apply 명령에도 --whitespace=nowarn 옵션이 가능하다)

Tip 2

git am 명령은 그냥 실행만 해도 표준입력으로부터 내용을 받아 commit을 생성할 rebase 모드로 들어간다. rebase 를 위해 .git/rebase-apply/ 라는 디렉토리가 만들어지는데, git-am이 비정상 종료를 하거나 Ctrl-C 로 강제 종료할 경우 생성된 디렉토리는 수작업으로 지워줘야한다. (git am --abort 혹은 rm -rf .git/rebase-apply)

$ git am
^C
$ git am
fatal: Stray .git/rebase-apply directory found.
Use "git am --abort" to remove it.
$ git am --abort

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함