본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

남이 편집 중인 파일을 손으로 스테이징하지 마

~12 min · version-control, collaboration, failure-modes, policy

Level 0젖은 흙
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

주인 없는 파일들

착지가 건드리는 것 대부분은 작업 단위 하나에 딱 속하는 자료고, 선점이 그걸 지켜줘. 그런데 몇 개는 모두가 공유해. 새 항목마다 등록하는 레지스트리, 새 항목마다 키를 더하는 메시지 카탈로그. 그것들은 아무도 선점 안 하고, 같은 오후에 세션 여럿이 편집하고, 흥미로운 실패가 사는 자리가 거기야.

비대칭을 배워둘 값어치가 있어. 어느 반쯤 된 상태가 위험한지 알려주니까. 자료가 아직 안 착지한 레지스트리 항목은 아무것도 안 그리고 아무것도 안 터뜨려. 안전하게 실패해. 메시지 키가 빠진 레지스트리 항목은 페이지를 지을 때 예외를 던져. 시끄럽게 실패하지. 그러니 치명적인 조합은 정확히 하나야. 이웃의 레지스트리 항목을 그들의 메시지 키 없이 커밋하는 것.

여기서 "공유 파일 조심해"보다 날카로운 규칙이 나와. 항목이 아니라 키를 확인해. 공유 배선을 커밋하기 전에, 레지스트리의 모든 항목이 모든 카탈로그에서 해소되는지 확인해. 네 것만이 아니라 전부. 남의 것이 안 되면 기다려. 친절하게 그 사람 블록을 대신 쓰지 마.

모든 영리한 대안을 이긴 정책

세션 여럿이 병렬로 돌 때 정착된 답은 이래. 세션마다 자기 자료만 커밋하고, 마지막 패스 하나가 공유 등록을 전부 일관성 검사가 붙은 커밋 하나로 배선한다. 눈에 보이는 비용이 있어. 배선이 착지할 때까지 자료는 존재하는데 어디에도 색인이 안 돼. 그 비용을 소리 내서 말하는 게 이 정책을 제안하는 일의 일부고.

놓치기 쉬운 성질도 하나 있어. 네 레지스트리 항목이랑 카탈로그 키를 둘 다 작업 트리에 커밋 안 한 채로 두는 게 안전하고 스스로 낫는다는 것. 둘이 같이 다니니까, 다음에 공유 파일을 커밋하는 세션이 네 걸 완전한 단위로 실어가. 사람들이 영리한 스테이징에 손 뻗게 만드는 그 불안은 근거가 없어. 저장소가 조용해질 때까지 배선을 인질로 잡을 필요 없어.

여기서 일반화되는 건 이거야. 공유 파일에 대한 규칙은 "조심해"가 아니라 어느 반쯤 된 상태가 시끄럽게 실패하는지를 아는 거야. 안전하게 실패하는 상태는 그냥 두면 되고, 시끄럽게 실패하는 상태 하나만 검사로 막으면 돼. 그러면 조심할 게 목록 하나로 줄어들고, 목록은 스크립트로 바꿀 수 있어.

동시 기록자가 있으면 경로로 범위를 잡고 절대 손으로 스테이징하지 마. 스테이징 층의 영리함은 격리 기제가 아니라 자기 발을 쏘는 총이야. 작동하는 기제는 두 강의 앞의 임시 인덱스고, 작동하는 이유는 정확히 공유 상태를 아예 안 건드려서야.

Code

일관성 검사, 그리고 그게 막는 실패·bash
# Run this BEFORE committing shared wiring. Note it checks EVERY
# entry, not just the one you added.

for key in $(extract_i18n_keys_from registry.tsx); do
  for catalog in messages/*.json; do
    grep -q "\"$key\"" "$catalog" || {
      echo "WAIT: '$key' missing from $catalog"
      echo "      it is not yours. do NOT author their block."
      exit 1
    }
  done
done


# WHY: the three half-states are not equally dangerous.
#
#   registry entry + material not landed
#     -> the renderer maps over entries and skips ones whose
#        material is missing. NO card, NO crash. fails SAFE.
#
#   catalog keys + no registry entry
#     -> unused keys are inert. fails SAFE.
#
#   registry entry + MISSING catalog key
#     -> the translation lookup throws at build time.
#        fails LOUD, and it ships under YOUR commit.
#
# So sweeping a neighbor's ENTRY into your commit is benign.
# Sweeping their entry WITHOUT their keys is the one lethal
# combination - hence: check the key, not the entry.

External links

Exercise

네 저장소에서 새 기능마다 반드시 건드려야 하는 파일을 찾아봐. 레지스트리, 카탈로그, 경로 표, 색인. 각각에 대해 반쯤 된 상태 셋을 적어. 내용 없는 항목, 항목 없는 내용, 의존 없는 항목. 어느 게 안전하게 실패하고 어느 게 시끄럽게 실패하는지 표시해. 시끄러운 쪽이 네 일관성 검사고, 대개 아무도 안 써본 다섯 줄짜리 스크립트야.
Hint
그 검사는 추가되는 항목만이 아니라 모든 항목을 덮어야 해. 막으려는 실패가 남의 반쯤 끝난 작업을 네 커밋으로 내보내는 거니까. 네 변경만 보는 검사는 정확히 그걸 잡으라고 존재하는 그 상황에서 신나게 통과해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.