컨테이너형 웹 서비스의 저장소를 정리하다가 예제 플러그인 12개가 실제 운영 플러그인이 적재되는 경로 안에서 추적되는 것을 확인했다. 사람은 예제와 운영 파일을 구분했지만 Git은 같은 경로에서 추적하는 파일로 다뤘다.

중첩된 저장소를 운영 루트로 합치려 하자 파일 소유 범위를 정해야 할 이유가 더 분명해졌다. 새 루트와 기존 저장소에서 추적이 겹치는 파일은 274개였고, 저장소의 Compose 파일도 운영 파일과 내용이 달랐다. 재귀 복사는 충돌을 드러내지 않고 덮어쓸 수 있었으며 checkout은 런타임 파일까지 소스처럼 되돌릴 수 있었다.

이미 추적 중인 파일은 .gitignore에 넣어도 계속 추적되므로 무시 규칙만 추가해서는 해결되지 않았다. 예제 플러그인을 별도 예제 경로로 옮기고 실행 중 생성되는 플러그인과 데이터는 Git의 소유 범위에서 빼야 했다. 운영 Compose 파일의 바이트는 그대로 보존했다.

이 경계를 반영한 후보 트리를 먼저 만들었다. 저장소 이력과 하위 모듈을 새 루트로 옮기고 충돌 파일을 항목별 목록으로 처리했다. 전체 Docker 빌드와 집중 테스트 70개, 격리된 시작 검사를 통과한 다음 실제 트리를 교체했다.

교체 뒤에는 소스 해시 97개와 깨끗한 Git 상태, 중첩 checkout 제거 여부, 애플리케이션 진입점을 다시 확인했다. 운영 컨테이너 4개는 재시작하지 않았다. 이미지와 설정 해시, 상태 검사 결과는 작업 전과 같았고 정상 상태가 유지됐다.

소스 트리를 합칠 때는 폴더를 줄이기 전에 Git이 관리할 파일과 운영 환경이 관리할 파일을 구분해야 한다. 이 경계가 없으면 디렉터리를 정리해 놓고도 다음 checkout에서 운영 파일을 바꾸게 될 수 있다.

2026/09/21 10:19 2026/09/21 10:19