워드프레스 프로젝트를 Git 에 올릴 때 첫 질문은 “코어까지 넣을까” 입니다. 하지만 그 질문보다 앞에 와야 할 기준이 있습니다. 이 파일을 우리가 썼는가. 이 한 문장이 커밋 대상 · 무시 대상 · 그리고 다음 회차의 비밀값 처리까지 전부 결정합니다.
우리가 쓴 것만 소스다
워드프레스 설치 디렉터리에는 성격이 전혀 다른 것들이 섞여 있습니다. 우리가 작성한 테마 · 플러그인 · mu-plugin 이 있고, 배포처에서 받아 온 코어와 서드파티 플러그인이 있고, 실행 중에 생성된 것 — 업로드 파일 · 캐시 · 로그 · 업그레이드 임시 폴더 — 이 있으며, 환경마다 다른 것 — wp-config.php — 이 있습니다.
왜 wp-config.php 와 업로드와 DB 덤프가 함께 아래쪽에 있는지가 중요합니다. 이유가 같기 때문입니다 — 자격증명과 생성된 콘텐츠는 소스가 아닙니다. 자격증명은 환경에 속하고, 업로드와 덤프는 실행의 결과입니다. 둘 다 커밋되는 순간 저장소는 “코드의 역사” 가 아니라 “데이터의 사본” 이 되고, 클론 · 포크 · CI 로그를 통해 통제 밖으로 퍼집니다.
빌드 산출물은 예외로 다룰 수 있습니다. 프로덕션 서버에 Node 를 두지 않기로 했다면 컴파일된 CSS · JS 를 커밋하는 편이 낫습니다. 다만 그 결정을 했으면 CI 에서 산출물이 소스와 맞는지를 검사해야 합니다 — 7회차에서 다룹니다.
.gitignore 두 가지 모양
코어까지 저장소에 두는 구성이라면 무시 목록만 적으면 됩니다.
# 저장소 루트의 .gitignore
/wp-config.php
/wp-content/uploads/
/wp-content/upgrade/
/wp-content/cache/
/wp-content/debug.log
*.sql
*.sql.gz
node_modules/
.env
반대로 우리 코드만 저장소에 두고 코어와 서드파티는 서버에서 관리한다면, 전부 무시하고 필요한 것만 다시 여는 편이 안전합니다. 새 플러그인이 설치돼도 저장소가 조용히 오염되지 않습니다.
/*
!/wp-content/
/wp-content/*
!/wp-content/themes/
!/wp-content/plugins/
!/wp-content/mu-plugins/
/wp-content/themes/*
!/wp-content/themes/our-theme/
/wp-content/plugins/*
!/wp-content/plugins/our-plugin/
이 패턴에는 규칙이 하나 있습니다 — 디렉터리가 무시된 상태에서는 그 안의 파일을 다시 열 수 없습니다. 그래서 상위 디렉터리를 먼저 ! 로 열고, 그 안을 다시 닫고, 원하는 하위만 다시 여는 순서가 됩니다. 왜 특정 파일이 안 잡히는지 헷갈릴 때는 추측하지 말고 Git 에 직접 묻습니다.
git check-ignore -v wp-content/themes/our-theme/style.css
어느 줄이 그 파일을 잡고 있는지 파일명과 줄 번호로 알려 줍니다.
이미 커밋해 버렸다면
.gitignore 는 이미 추적 중인 파일에는 효과가 없습니다. 나중에 규칙을 추가해도 그 파일은 계속 따라옵니다. 추적에서만 빼려면 작업 트리는 남기고 인덱스에서 제거합니다.
git rm --cached wp-config.php
git rm -r --cached wp-content/uploads
다만 이것으로 과거가 지워지지는 않습니다. 이전 커밋에는 그대로 남아 있고, 그 안에 비밀번호가 있었다면 그 비밀번호는 이미 유출된 것입니다. 히스토리를 다시 쓰는 도구가 있지만, 그것으로도 이미 만들어진 클론과 CI 로그는 되돌아오지 않습니다. 유일한 해결은 값을 교체하는 것이고, 이것이 다음 회차의 주제입니다.
저장소 규율과 배포 흐름 전반은 개발 워크플로우 아카이브에 이어지고, 사이트가 지금 어떤 상태인지부터 점검하고 싶다면 무료 도구의 사이트 진단으로 시작할 수 있습니다.
다음 회차
저장소에서 wp-config.php 를 뺐으니, 이제 그 값을 어디에 둘지 정해야 합니다. 다음 회차는 환경별 설정과 비밀값 — 그리고 커밋된 비밀값을 되돌리는 유일한 방법입니다.