카테고리 없음

워드프레스 소스를 git으로 관리하기 - 코어까지 통째로

바뿌 2026. 10. 26. 20:15

워드프레스를 Docker 공식 이미지로 쓰면 소스가 컨테이너 안에 숨어 있습니다. 파일을 직접 보거나 고칠 수 없고, 업데이트도 이미지가 알아서 합니다.

편하지만 통제권이 없습니다. 그래서 공식 소스를 직접 받아 git으로 관리하기로 했습니다.

결론부터

github.com/WordPress/WordPress   (공식 미러, upstream)
        │  git clone --branch <버전태그>
        ▼
   내 저장소 (origin)  ──►  서버

워드프레스는 GPL 오픈소스이고 공식 git 미러가 있습니다. 거기서 받아 쓰면
업데이트도 git으로 할 수 있습니다.

이미지에 맡기기 git으로 관리
코어 업데이트 자동 git 으로 직접
파일 변조 탐지 불가 git status 로 즉시
코어 수정 불가 가능
관리 부담 적음 보안 패치를 직접 따라가야

해킹으로 파일이 심어지면 git status 에 바로 뜹니다. 이게 가장 큰 이점입니다.

1. 공식 소스 받기 — 태그를 지정합니다

git clone --depth 1 --branch 7.1.2 \
  https://github.com/WordPress/WordPress.git wp-src

--branch 에 버전 태그를 반드시 지정하세요. 안 하면 기본 브랜치를 받는데, 거기는 개발 중인 alpha 버전입니다.

저는 이걸 놓쳐서 7.2-alpha 를 받았습니다. 버전 파일을 열어보고서야 알았습니다.

grep "wp_version =" wp-includes/version.php
# $wp_version = '7.2-alpha-63948';   ← 이러면 잘못 받은 것

2. 히스토리를 가져갈 것인가

전체 히스토리를 받으면 무겁습니다. 실제로 재보니 이랬습니다.

전체 clone      .git 326M + 작업파일 155M
현재 버전만      .git  68M + 작업파일 155M

326M이 전부 20년치 커밋 이력입니다. 블로그 운영에는 쓸 일이 없습니다.

히스토리를 버리고 현재 버전만 담으려면 이렇게 합니다.

# 받은 소스에서 .git 을 떼고 새로 시작
rsync -a --exclude=.git 원본/ wp-src/
cd wp-src
git init
git add -A
git commit -m "WordPress 7.1.2 베이스라인"
git remote add upstream https://github.com/WordPress/WordPress.git

upstream 을 걸어두면 나중에 새 버전을 받아올 수 있습니다. 히스토리는 없어도 태그는 가져옵니다.

3. 업데이트 — merge 대신 파일 교체

히스토리가 없으니 git merge 는 쓸 수 없습니다. 대신 새 태그의 파일만 덮어씁니다.

git fetch upstream --tags          # 공식에서 새 태그 받기
git checkout 7.1.3 -- .            # 파일만 가져오기 (히스토리 병합 아님)
git status --short                 # ← 뭐가 바뀌었는지 확인
git commit -am "WordPress 7.1.3"

git checkout <태그> -- . 가 핵심입니다. 그 태그 시점의 파일로 작업 트리를 바꾸되, 커밋 이력은 내 것으로 유지합니다.

실제로 7.1.1 → 7.1.2 를 해보니 이렇게 나왔습니다.

3 files changed, 93 insertions(+), 7 deletions(-)
M  wp-admin/about.php
M  wp-includes/template.php
M  wp-includes/version.php

마이너 업데이트는 바뀌는 파일이 몇 개 안 됩니다. 뭐가 달라졌는지 전부 볼 수 있습니다.

공식에 없는 파일(내가 만든 테마 등)은 checkout 이 건드리지 않습니다.
그래서 내 작업물과 코어 업데이트가 섞이지 않습니다.

4. .gitignore — 서버가 만드는 것은 넣지 않습니다

wp-config.php          # DB 접속정보. 서버마다 다르다
.htaccess              # 서버 설정
wp-content/uploads/    # 업로드 이미지 → 백업 대상이지 git 대상 아님
wp-content/cache/
wp-content/upgrade/
*.log

wp-config.php 를 커밋하면 DB 비밀번호가 저장소에 들어갑니다. 가장 먼저 제외해야 합니다.

⚠️ 5. 자동 업데이트와 양립하지 않습니다

이 방식을 택하면 코어 자동 업데이트를 포기해야 합니다.

자동 업데이트가 코어 파일을 바꾸면,

  • git status 에 수백 개 변경이 뜹니다
  • 변조 탐지가 무의미해집니다 — 해킹인지 업데이트인지 구분이 안 됩니다

실제로는 파일 소유권으로 자연히 막힙니다. 웹서버(www-data)가 코어 파일에 쓰기 권한이 없으면 자동 업데이트가 실패합니다.

ls -ld wp-src/wp-includes wp-src/wp-content
# drwxrwxr-x ubuntu:ubuntu     wp-includes   ← 웹서버가 못 씀 (의도한 것)
# drwxrwxr-x www-data:www-data wp-content    ← 플러그인·테마는 가능

대신 보안 패치를 직접 따라가야 합니다. 주기적으로 확인하는 장치가 필요합니다.

# 새 버전 나왔는지 확인
git fetch upstream --tags -q
git tag -l | grep -E '^[0-9]+\.[0-9]+(\.[0-9]+)?$' | sort -V | tail -1

크론에 걸어두면 됩니다.

저는 소스를 직접 손에 쥐고 싶어서 이 길을 택했습니다.

이미지에 맡기면 편하지만, 무엇이 언제 바뀌는지 알 수 없습니다. 오픈소스인데 정작 소스를 볼 수 없는 상태가 이상하게 느껴졌습니다.

대신 보안 패치를 챙기는 일이 제 몫이 됐습니다. 자동으로 올라가던 것을 제가 확인하고 반영해야 합니다. 편의를 하나 내주고 통제를 하나 받은 셈입니다.

정리

  • 워드프레스는 공식 git 미러가 있습니다. 거기서 받아 관리할 수 있습니다
  • --branch <버전태그> 를 꼭 지정하세요. 기본 브랜치는 alpha입니다
  • 히스토리 326M은 버려도 업데이트에 지장이 없습니다
  • 업데이트는 git checkout <태그> -- . 로 파일만 교체합니다
  • wp-config.php 는 절대 커밋하지 마세요
  • 자동 업데이트를 포기하는 대신 변조 탐지를 얻습니다. 보안 패치 확인은 직접 챙겨야 합니다