SVN 폴더 무시가 안 될 때: svn:ignore와 이미 추적된 파일 해결 순서

무시한 항목이 계속 보이면 패턴부터 바꾸기보다, 미추적 파일인지·추가 예약인지·이미 커밋된 파일인지 먼저 구분하세요. svn:ignore는 이미 버전 관리 중인 파일의 변경을 숨기지 않습니다. 무시한 새 파일도 직접 지정해 svn add하면 추가될 수 있습니다.

SVN은 소스를 복구하거나 이전 수정 내역을 확인할 때 요긴하게 쓰고 있습니다. 무시 목록을 다룰 때도 필요한 소스와 기록을 놓치지 않는 것이 먼저입니다. 변경 목록을 비우려고 추적을 끊기보다, 소스와 자동 생성물을 구분해야 하니까요.

명령줄 예시는 작업 복사본에서 실행합니다. 실제 동작은 Codex가 Subversion 1.14.3과 새 로컬 테스트 저장소·작업 복사본 두 개로 별도 확인했습니다. 아래 테스트 폴더명은 설명용이며 사용자 소스나 운영 저장소를 수정한 기록이 아닙니다. Windows용 TortoiseSVN 부분은 공식 문서 기준이며 GUI를 직접 시험한 결과와 구분합니다.

먼저 상태를 읽기

svn status
svn status --no-ignore
svn info path/to/item

svn status는 기본적으로 로컬 상태를 보여줍니다. --no-ignore를 붙이면 숨겨졌던 무시 항목도 확인할 수 있습니다. svn info가 정보를 반환한다는 사실만으로 커밋까지 끝났다고 판단하지 않습니다. 추가 예약인 A도 버전 관리 정보가 생길 수 있기 때문입니다.

표시 뜻 다음 확인
? 아직 미추적 부모 폴더의 무시 패턴
I 미추적이며 무시됨 삭제된 것이 아님
A 추가 예약 아직 커밋 전인지·복사/이동인지
M 추적 중인 파일의 내용 변경 무시로 숨길 수 없음
두 번째 칸의 M 폴더·파일의 속성 변경 ignore 속성을 바꿨다면 정상

M .처럼 첫 칸은 비어 있고 두 번째 칸에 M이 보이면 현재 폴더의 속성이 바뀐 것입니다. ignore를 수정한 뒤 이 표시가 남는 것은 적용 실패가 아닙니다. !·C 같은 누락·충돌 표시는 별도 문제이며, ignore로 해결하려고 하지 않습니다.

미추적 폴더는 부모에 규칙을 넣기

작업 복사본이 아래와 같고 build를 제외하려면, 속성은 build 안이 아니라 project에 붙입니다.

project/
├── src/
├── build/
└── README.md
cd project
svn propget svn:ignore .
svn propedit svn:ignore .

기존 속성을 먼저 읽고, 편집기에서 원래 패턴을 남긴 채 필요한 항목을 한 줄씩 추가합니다.

build
*.log
*.tmp

svn propset svn:ignore build .는 “build만 추가”하는 명령이 아니라 속성값 전체를 build로 바꾸는 명령입니다. 이미 다른 패턴이 있다면 덮어쓰지 않도록 propedit으로 편집하세요. 편집기가 열리지 않으면 SVN의 외부 편집기 설정을 확인하거나, TortoiseSVN의 폴더 Properties에서 수정할 수 있습니다.

svn propget svn:ignore .
svn status
svn status --no-ignore

일반 status와 --no-ignore 결과를 비교합니다. I는 파일이 지워졌다는 뜻이 아닙니다. 공유할 규칙이라면 부모 폴더의 속성 변경도 검토 후 커밋해야 합니다. 적용 범위와 미추적 항목 처리 원리는 Version Control with Subversion의 ignore 설명을 참고했습니다.

패턴이 맞는데도 추가되는 경우

직접 지정한 svn add는 무시 목록을 건너뛸 수 있습니다

아래는 별도 테스트 저장소에서 build를 무시한 뒤 확인한 실제 출력입니다. I였던 항목을 명령의 대상으로 직접 지정하자 추가 예약인 A가 됐습니다.

$ svn status --no-ignore build
I       build

$ svn add build
A         build
A         build/generated.txt

따라서 “ignore를 넣었으니 다시 추가될 수 없다”는 뜻은 아닙니다. bash·zsh처럼 *를 파일 목록으로 펼치는 셸에서 svn add *를 실행하는 것도 각 파일을 직접 지정하는 형태가 될 수 있습니다.

하위의 새 항목을 한꺼번에 추가하면서 ignore를 지키려는 명령은 svn add --force .입니다. 이미 추적 중인 폴더에서도 내려가 새 항목을 찾는 옵션이며, ignore를 무시한다는 뜻의 force가 아닙니다. 반대로 --no-ignore를 붙이면 무시 규칙을 무시합니다. 일괄 추가는 다른 새 파일도 포함하므로 실행 뒤 status의 A 목록을 확인해야 합니다.

A라면 저장소 삭제보다 추가 예약 취소부터

직접 svn add한 새 파일·폴더이며 아직 커밋하지 않았다면, 다음처럼 해당 항목의 추가 예약을 취소할 수 있습니다.

svn revert -R build
svn status --no-ignore

별도 시험에서는 추가 예약을 취소한 뒤에도 build/generated.txt가 로컬에 남았고, 부모의 ignore에 따라 다시 무시됐습니다. 원래 버전 관리 중인 파일에 무작정 같은 revert를 적용하면 미커밋 변경을 버릴 수 있습니다. A +처럼 복사 이력이 붙거나 이동 작업으로 생긴 항목도 단순한 새 파일 추가와 구분하세요.

하위 폴더와 공통 규칙은 적용 범위가 다릅니다

루트의 svn:ignore에 trunk/cache를 적어도 손자 경로를 직접 무시하는 규칙이 되지 않습니다. trunk의 속성을 편집하고, 이름은 cache로 넣습니다.

svn propget svn:ignore trunk
svn propedit svn:ignore trunk
# 기존 패턴을 남기고 cache를 새 줄에 추가

build와 Build, *.log와 UPPER.LOG처럼 대소문자도 확인합니다. 별도 1.14.3 시험에서 *.log 규칙은 app.log를 무시했지만 UPPER.LOG는 미추적으로 남았습니다. 패턴은 단순 이름을 기준으로 하며, 경로와 확장자·대소문자를 함께 점검해야 합니다.

규칙 적용 범위 공유 방식
svn:ignore 속성을 붙인 폴더의 바로 아래 이름 폴더 속성을 커밋해 공유
svn:global-ignores 해당 경로와 하위 트리의 이름 패턴 속성을 커밋해 공유 · 1.8 이상
클라이언트 global-ignores 해당 PC·사용자 설정이 적용되는 작업 복사본 로컬 설정 · 팀에 자동 공유되지 않음

svn:global-ignores는 Subversion 1.8에서 추가된 상속 속성입니다. svn:ignore와 이름은 비슷하지만 하위 트리에 적용되는 범위가 다릅니다. 클라이언트 설정의 global-ignores와도 구분합니다. 세 규칙은 함께 적용되므로, 현재 폴더의 ignore만 읽어서는 숨김 이유가 전부 보이지 않을 수 있습니다.

svn propget -v --show-inherited-props svn:global-ignores trunk/deep

위 명령은 하위 폴더에 상속된 속성의 출처까지 읽습니다. 새 규칙을 설정하는 명령이 아닙니다. 팀에 1.7 이하 클라이언트가 남아 있다면 디렉터리별 svn:ignore를 우선 검토하세요. 도입 조건과 범위는 Apache Subversion 1.8 릴리스 안내에서 확인했습니다.

이미 커밋된 생성물의 추적을 중단할 때

추적 중인 파일이 M으로 나타나는 것은 SVN이 변경을 관리하고 있다는 뜻입니다. ignore를 더 넣어도 그 변경은 사라지지 않습니다. 소스·공유 설정·배포에 필요한 파일이라면 추적을 유지합니다. 자동으로 다시 만드는 생성물이며 팀에서 저장소 제외를 합의한 경우에만 다음 단계로 넘어갑니다.

  1. 원본과 미커밋 수정본을 작업 복사본 바깥에 따로 백업합니다. 파일 목록과 재생성 방법도 확인합니다.
  2. 부모 폴더의 기존 ignore를 읽고, 제외할 생성 폴더 이름을 추가합니다. 이미 추적 중인 동안에는 이 규칙만으로 숨겨지지 않습니다.
  3. 아래 명령으로 로컬 경로의 삭제를 예약하고 status와 삭제 범위를 확인합니다. URL을 delete 대상으로 주는 즉시 저장소 삭제 방식과 혼동하지 않습니다.
svn delete --keep-local output
svn status
svn diff --summarize

여기서는 아직 커밋하지 않습니다. --keep-local은 이 작업 복사본의 파일을 남긴다는 뜻입니다. 커밋할 변경에는 저장소 경로 삭제가 들어갑니다. 팀과 삭제 범위를 확인해 커밋할 때는 삭제 예약과 부모 ignore 속성 변경을 함께 검토합니다.

별도 로컬 시험에서는 수정된 output/artifact.txt에 delete를 예약한 뒤에도 내용이 남았습니다. 하지만 삭제를 커밋한 뒤 다른 깨끗한 작업 복사본을 update하자 output 폴더가 제거됐습니다. 다른 작업 복사본에도 수정본이나 미추적 파일이 있으면 충돌 등 다른 결과가 생길 수 있습니다. 내 PC에 남았다는 사실을 팀 전체의 파일 보존으로 해석하면 안 됩니다.

삭제 예약을 되돌려도 수정본까지 보존되는 것은 아닙니다

커밋 전의 삭제 예약은 svn revert -R output으로 되돌릴 수 있지만, 이는 “현재 로컬 수정본을 그대로 둔다”는 명령이 아닙니다. 시험에서 이 명령 뒤에는 수정한 파일 내용이 원래 저장소 기준 내용으로 돌아왔습니다. 별도로 둔 백업에만 수정 내용이 남았습니다.

따라서 백업 없이 되돌리기부터 실행하지 마세요. 이미 커밋한 삭제를 되돌리는 일도 로컬 revert와는 다른 작업입니다. svn revert 공식 참고서 역시 미커밋 변경을 버리는 동작임을 설명합니다. 저장소에 들어간 비밀번호·토큰도 ignore만 추가한다고 과거 이력에서 없어지지는 않습니다.

폴더는 남기고 새 내용물만 무시할 때

runtime 폴더 자체는 공유하되 실행 중 생기는 새 자식 항목만 제외하려면, 그 폴더의 ignore를 편집하고 *를 한 줄로 넣습니다.

svn propget svn:ignore runtime
svn propedit svn:ignore runtime
# 기존 값과 적용 범위를 검토하고 * 패턴 추가

이렇게 해도 이미 추적 중인 자식 파일은 계속 관리됩니다. *는 필요한 신규 파일도 숨길 수 있으므로 소스 폴더 전체보다는 용도가 정해진 생성 폴더에 적용합니다. 폴더 구조를 남기는 것과 기존 자식 파일의 추적을 끊는 것은 별개입니다.

TortoiseSVN의 무시 목록과 커밋 제외는 다릅니다

미추적 파일·폴더의 Add to Ignore List는 해당 이름이나 확장자 패턴을 무시하는 기능입니다. 하위에도 적용하는 recursively 항목은 1.8 이상 클라이언트 조건을 확인합니다. 로컬 PC의 Global Ignore List와 프로젝트 폴더의 속성도 공유 범위가 다릅니다. TortoiseSVN의 ignore 공식 설명을 기준으로 구분했습니다.

이미 추적된 파일을 이번 커밋에서만 빼려면 커밋 목록에서 선택을 해제합니다. 자주 제외할 로컬 수정 파일에는 TortoiseSVN의 ignore-on-commit changelist도 있지만, 추적을 중단하거나 SVN의 M 상태를 숨기는 기능은 아닙니다. 다른 SVN 클라이언트의 커밋까지 자동으로 막아준다고 볼 수도 없습니다.

changelist는 로컬 클라이언트 기능입니다. 팀의 공통 ignore 규칙을 배포하는 용도로 쓰지 않습니다. 역할은 TortoiseSVN Change Lists 공식 설명에서 확인할 수 있습니다. 공유 설정과 개인 설정이 계속 충돌한다면 템플릿 파일은 추적하고 개인 파일을 무시하도록 나누는 방법을 검토합니다.

적용 여부는 목록이 아니라 상태로 확인하기

미추적이면 부모와 패턴을, A라면 추가 예약과 커밋 여부를, 이미 커밋된 파일이면 추적을 유지할지부터 확인합니다. 무시한 항목도 직접 add하면 다시 추가될 수 있고, --keep-local도 다른 작업 복사본까지 지켜주지는 않습니다.

검증 범위는 새 로컬 저장소의 Subversion 1.14.3 명령줄 동작입니다. 속성은 시험용 propset으로 설정했고, 외부 편집기를 여는 propedit과 TortoiseSVN UI는 공식 문서를 기준으로 안내했습니다. 확인 기준일은 2026년 10월 15일입니다.

댓글 남기기