티스토리 뷰
상태
어떤 프로젝트에 기생하는 폴더가 하나 있다. 여하한의 이유로 그 폴더가 분리되지 않은 채 있었고, 변경이력이 장기간 쌓여 왔다. 이젠 새로운 저장소로 해당 폴더만 이관하고 싶다.
아이디어
- "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
- tattertools
- Subversion
- 디버깅
- nodejs
- 커피
- perl
- MySQL
- ssh
- writely
- SSO
- 구근
- 벤자민
- Linux
- 대화
- 오픈소스
- TCP/IP
- VIM
- 수선화
- BlogAPI
- 식물
- Tattertools plugin
- JavaScript
- 킹벤자민
- OpenID
- url
- 퀴즈
- SVN
- 클레로덴드럼
- 덴드롱
- macosx
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |