From 03fdcaa12c53c3561c03e8d37c5328962d648181 Mon Sep 17 00:00:00 2001 From: Mother Seara Date: Wed, 19 Aug 2026 12:38:14 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix(gitignore):=20=EB=84=93=EC=9D=80=20?= =?UTF-8?q?=EB=B6=80=EC=A0=95=EC=9D=B4=20=EB=B9=8C=EB=93=9C=20=EC=82=B0?= =?UTF-8?q?=EC=B6=9C=EB=AC=BC=EC=9D=84=20=EB=90=98=EC=82=B4=EB=A0=B8?= =?UTF-8?q?=EB=8B=A4=20=E2=80=94=20catalog=20=EC=95=84=EB=9E=98=20.pyc=20?= =?UTF-8?q?=EC=9E=AC=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `pytest` 를 한 번 돌리면 **추적 중인 바이너리가 더러워진다**: M catalog/__pycache__/draft_specimen.cpython-310.pyc 원인은 "규칙 생기기 전에 커밋돼서"가 아니다(그럴듯하지만 틀렸다). `.gitignore` 1~2행에 `__pycache__/`·`*.pyc` 가 **있고**, 26행의 **`!catalog/**`** 가 그보다 **뒤에 있어 그걸 다시 포함**시킨 것이다. 그 부정은 07-27 에 **다른 버그**를 고치려고 넣었다 — `*promo*` 가 경로 어디든 매칭돼 `bug_derived_headroom_promoted_to_target.md` 같은 정상 도감 항목을 조용히 삼켰다. 그 수리는 옳았지만 **범위가 넓어 빌드 산출물까지 되살렸다.** ⇒ **넓은 부정에는 좁은 재제외가 따라와야 한다.** !catalog/** catalog/**/__pycache__/ ← 추가 catalog/**/*.pyc ← 추가 + `git rm --cached` 로 이미 추적 중이던 .pyc 한 장 제거 검증 셋: ① 그 .pyc 이 이제 무시된다(`check-ignore` → `.gitignore:30`) ② 도감 `.md` 는 여전히 무시 안 된다 — **07-27 부정의 원래 목적이 살아 있다** ③ `pytest` 뒤 워킹트리에 의도한 변경만 남는다(더럽혀지는 바이너리 없음) 분모: `catalog/` 아래 추적 중인 비-`.md` 파일은 **2개**였다 — 이 `.pyc`(제거)와 `draft_specimen.py`(정상 도구). 나머지 추적-그러나-무시 대상은 **0**. ⚠️ 이 분모를 처음엔 **틀리게 셌다**: `git check-ignore` 는 `--no-index` 없이는 추적 파일을 보고하지 않아 "0건"이 나왔다. 도구를 고쳐 다시 센 값이 위의 것이다. 발견 = [자생](오늘 `git diff --stat` 에서 보고 `.pyc` 를 PR 에 실을 뻔했다). ⚠️ 원인 진단은 그쪽 것과 다르다 — 위에 적은 대로 **부정 규칙**이 범인이다. Co-Authored-By: Claude Opus 5 (1M context) --- .gitignore | 5 +++++ .../__pycache__/draft_specimen.cpython-310.pyc | Bin 7706 -> 0 bytes 2 files changed, 5 insertions(+) delete mode 100644 catalog/__pycache__/draft_specimen.cpython-310.pyc diff --git a/.gitignore b/.gitignore index 73fcec8..2b2fb20 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,11 @@ my_model.json # 같은 정상 항목을 조용히 삼켰다(07-27 작성 → 커밋된 적 없음, `git status`에도 # 안 뜸). 무시된 파일은 미추적으로도 안 보이므로 개수를 세기 전엔 드러나지 않는다. !catalog/** +# ...단 그 예외가 빌드 산출물까지 되살렸다. `!catalog/**` 는 1~2행의 `__pycache__/`·`*.pyc` +# 보다 뒤에 있어 catalog/ 아래 .pyc 를 **다시 포함**시켰고, 그래서 `pytest` 를 한 번 돌리면 +# 추적 중인 바이너리가 더러워졌다. 넓은 부정에는 좁은 재제외가 따라와야 한다. +catalog/**/__pycache__/ +catalog/**/*.pyc # 도감 표본 초안 (catalog/draft_specimen.py 산출) — 사람이 완성·검증 전엔 커밋 금지. # 완성되면 .DRAFT.md → .md 로 승격해 정식 항목이 된다. diff --git a/catalog/__pycache__/draft_specimen.cpython-310.pyc b/catalog/__pycache__/draft_specimen.cpython-310.pyc deleted file mode 100644 index 739cac48f1022071379c48135f3de026158ae93b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7706 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 YpMFQSCyW2C-PzsgTz~dK6!^FP3qGcUl>h($ From c77cad486c6d45caa85052328ef2732a64a23d61 Mon Sep 17 00:00:00 2001 From: Mother Seara Date: Wed, 19 Aug 2026 12:42:07 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix(gitignore):=20=EC=95=9E=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B=EC=9D=98=20=EC=9D=B8=EA=B3=BC=20=EC=84=9C=EC=88=A0?= =?UTF-8?q?=EC=9D=84=20=EC=A0=95=EC=A0=95=ED=95=9C=EB=8B=A4=20=E2=80=94=20?= =?UTF-8?q?=EC=A6=9D=EC=83=81=EC=9D=98=20=EC=9B=90=EC=9D=B8=EC=9D=80=20'?= =?UTF-8?q?=EC=B6=94=EC=A0=81=20=EC=83=81=ED=83=9C'=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 앞 커밋이 *"`!catalog/**` 가 되살렸고 **그래서** pytest 가 바이너리를 더럽혔다"* 라고 썼는데 그 **"그래서"가 틀렸다.** 실험으로 확인: printf '*.pyc\n' > .gitignore ; git add -f a.pyc ; git commit echo v2 > a.pyc ; git status --porcelain → M a.pyc # 무시 규칙에 걸려도 추적 파일이면 수정이 보고된다 ⇒ **.gitignore 는 추적 파일에 아예 안 듣는다.** 그러니 · 증상(`pytest` 뒤 ` M …pyc`)의 원인은 **추적 상태**이지 26행이 아니고 · 26행이 설명하는 것은 **어떻게 추적으로 들어왔나 · `git rm --cached` 뒤에 왜 되살아나나** 다 · `check-ignore` 가 기본값에서 추적 파일을 안 보는 것도 같은 이유다 — 그 도구에겐 추적 파일이 애초에 "무시 여부를 물을 대상"이 아니다 **수리 자체는 안 바뀐다** — 오히려 왜 둘 다 필요했는지가 분명해진다: `git rm --cached` 만 하면 다음 넓은 `git add` 에 되살아나고, 재제외만 하면 이미 추적 중인 건 그대로다. 정정 출처 = [자생]. 앞 커밋 본문은 **지우지 않고** 이 커밋으로 덧댄다. Co-Authored-By: Claude Opus 5 (1M context) --- .gitignore | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 2b2fb20..2504f37 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,12 @@ my_model.json # 안 뜸). 무시된 파일은 미추적으로도 안 보이므로 개수를 세기 전엔 드러나지 않는다. !catalog/** # ...단 그 예외가 빌드 산출물까지 되살렸다. `!catalog/**` 는 1~2행의 `__pycache__/`·`*.pyc` -# 보다 뒤에 있어 catalog/ 아래 .pyc 를 **다시 포함**시켰고, 그래서 `pytest` 를 한 번 돌리면 -# 추적 중인 바이너리가 더러워졌다. 넓은 부정에는 좁은 재제외가 따라와야 한다. +# 보다 뒤에 있어 catalog/ 아래 .pyc 를 다시 포함시킨다. 넓은 부정에는 좁은 재제외가 따라와야 한다. +# +# ⚠️ 정확히: `pytest` 뒤 워킹트리가 더러워진 것은 그 파일이 **이미 추적 중**이라서다 — +# .gitignore 는 추적 파일에 아예 안 듣는다. 이 부정이 설명하는 것은 *어떻게 추적으로 +# 들어왔나*와 *`git rm --cached` 뒤 넓은 `git add` 에 왜 되살아나나* 다. 그래서 수리가 +# 둘이다: 추적 해제(한 번) + 재제외(다시 안 들어오게). catalog/**/__pycache__/ catalog/**/*.pyc