접은 앱도 코드는 지우지 않는다. 기능을 다른 앱으로 옮기거나 아이디어를 다시 꺼낼 때 쓴다. 문제는 그 앱들이 작업 폴더에 그대로 있었다는 점이다. 코드 검색과 색인에 걸렸고, 에이전트가 작업할 프로젝트를 고를 때 후보로 섞였다. 폴더마다 보관 중이라는 표시 파일을 두고 건너뛰게 했지만, 그 파일을 읽지 않으면 소용이 없었다.
그래서 작업 폴더에서 빼기로 했다. 대상은 iOS 앱 10개였고, 저장소로는 15개였다. 한 서비스가 저장소 6개로 나뉘어 있었다.
이력째 옮기기
보관용 저장소를 하나 만들고 git subtree add로 각 앱을 ios/<앱>/ 아래에 넣었다. 파일만 복사하지 않고 커밋 이력까지 들어가서, 다 넣고 나니 커밋이 637개였다.
넣기 전에 정리한 것이 있다.
- 커밋하지 않은 변경은 앱마다 스냅샷 커밋으로 남겼다. 한 저장소는 의존성 폴더가 없어 린트 훅이 실패해서, 그 커밋에만 훅을 건너뛰었다.
- 푸시하지 않은 커밋이 세 저장소에 하나씩 있었다. 각자의 원격에 먼저 푸시했다.
- 메인 브랜치와 합쳐지지 않은 작업 브랜치 두 개는
side/접두어를 붙여 따로 넣었다.
지우기 전 확인
옮긴 내용이 원본과 같은지는 트리 해시로 확인했다. 원본 저장소 커밋의 트리 해시와 보관 저장소에서 해당 경로의 트리 해시가 같으면 파일 내용이 완전히 같다. 브랜치를 포함해 18개 항목이 모두 일치했다.
그 다음 순서로 지웠다.
- 개별 GitHub 저장소 설명에 새 위치를 적고 읽기 전용으로 보관 처리했다.
- 로컬에서 Git이 무시하던 파일을 확인했다. 의존성 폴더, 빌드 산출물, 원본이 다른 곳에 있는 설정 파일뿐이었다.
- 로컬 폴더를 지웠다. 디스크 2.7GB가 비었다.
다시 꺼낼 때는 git subtree split으로 해당 경로만 떼어 내면 이력까지 같이 나온다. 며칠 뒤 접은 앱 하나도 같은 순서로 옮겼다.
