GitNotes.5-1.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 5.1: .gitignore 파일을 이용하여 파일과 디렉토리를 ignore 처리하기

Git 은 특정 파일이나 디렉토리를 ignore 하도록 설정할 수 있다 — 다른 말로 하면, Git 으로 하여금 해당 파일이나 디렉토리를 관리 (track) 하는 목록에서 제외하도록 한다는 것이다 — 그중의 한 방법이 바로 사용자의 저장소 내에 하나 혹은 그 이상의 .gitignore 파일을 만들어 놓는 것이다.

소프트웨어 프로젝트들의 경우, .gitignore 파일에는 빌드시나 런타임에 자동으로 생성되는 파일이나 디렉토리의 목록을 기입해 놓는 것이 일반적이다.

.gitignore 파일내에는 다음과 같은 항목들을 가리키는 이름이나 경로가 포함될 수 있다:

  1. 임시 리소스들 예: 캐시 파일, 로그 파일, 컴파일된 코드 등.
  2. 다른 개발자들과 공유할 필요 없는 (혹은 공유되어서는 안되는) 로컬 설정 파일들
  3. 로그인 암호나 키, 혹은 credential 파일들과 같이 민감한 정보를 담고 있는 파일들

Git 저장소의 최상위 디렉토리에 해당 파일이 존재할 경우, 파일 내에 기술된 규칙은 전체 저장소 내의 모든 파일들과 서브디렉토리들에 재귀적(recursive)으로 적용될 것이다. 만약 특정 서브디렉토리에 존재할 경우에는, 해당 디렉토리와 해당 디렉토리의 서브디렉토리에 규칙이 적용된다.

만약 특정 디렉토리나 파일이 ignore 처리될 경우 아래와 같은 효과가 있다:

  1. Git 에 의해 변경 내역이 추적(track) 되지 않는다
  2. git statusgit diff 와 같은 명령어 수행시에 검출되지 않는다
  3. git add -A 와 같은 명령어 수행시에도 stage 영역에 추가되지 않는다

이미 현재 Git 에 의해 관리 (track) 되고 있는 파일을 ignore 처리하려는 예외적인 상황시에는 특별한 주의가 필요하다. "5.5: Git 저장소에 이미 커밋 되어있는 파일을 ignore 처리하기" 섹션을 참고하라.

예제

아래에 .gitignore 파일에서 사용되는, glob 파일 패턴 기반의 일반적인 규칙들의 사용 예제가 나와있다:

# # 로 시작하는 줄은 주석에 해당한다. # 'file.ext' 이라는 이름의 파일을 ignore 처리한다 file.ext # ignore 규칙을 정의하는 줄에 주석을 함께 섞어 쓰는 것은 허용되지 않는다 # 아래 줄은 'file.ext # not a comment' 라는 이름의 파일을 ignore 처리할 것이다 file.ext # not a comment # 전체 경로를 통해 파일 ignore 처리하기 # 파일명만 기술된 규칙은 최상위 디렉토리뿐만 아니라 모든 서브디렉토리에 동일하게 적용된다 # 예) otherfile.ext 파일은 하부의 디렉토리 어디에 있던 모두 ignore 처리될 것이다 dir/otherdir/file.ext otherfile.ext # 디렉토리 전체를 ignore 처리하기 # 디렉토리 자체와 디렉토리 내의 모든 내용물들이 ignore 처리된다 bin/ gen/ # Glob 패턴 형식을 사용하여 특정 문자를 포함하는 경로를 ignore 처리할 수 있다 # 예를 들어, 아래의 규칙은 build/ 와 Build/ 두가지 경로 모두에 해당한다 [bB]uild/ # / 로 끝나지 않는 경로의 경우에는, 해당 규칙이 기술된 이름을 갖는 파일과 디렉토리 모두에 적용된다 # 따라서, 아래 예제는 `gen` 이라는 이름을 가진 파일들 뿐만 아니라 # 동일한 이름의(`gen`) 디렉토리 및 해당 디렉토리의 내용물까지 모두 ignore 처리하게 된다 bin gen # 파일을 확장자 별로 ignore 처리하기 # 아래 기술된 확장자를 갖는 현재 디렉토리와 # 모든 서브디렉토리 내의 파일들이 ignore 처리될 것이다 *.apk *.class # 특정 디렉토리 지정과 특정 확장자 지정 규칙을 혼합하여 사용하는 것도 가능하다 # 아래에 기술된 규칙이 ignore 처리할 파일들은 # 위에서 지정한 규칙들이 ignore 처리하는 파일들과 중복된다 java/*.apk gen/*.class # 최상위 디렉토리에 존재하는 파일을 ignore 처리하되, # 서브디렉토리 내의 동일한 이름을 갖는 파일들은 제외하고 싶다면 `/` 를 앞에 붙인다 /*.apk /*.class # DirectoryA 라는 이름의 디렉토리가 저장소 내 어떤 위치에 존재하던 # 모두 ignore 처리하고 싶다면 ** 를 앞에 붙인다 # / 를 마지막에 붙이는 것을 잊지 말아야 한다 # 그렇지 않으면 DirectoryA 라는 이름의 디렉토리 뿐만 아니라 파일들까지 ignore 처리하게 된다 **/DirectoryA/ # 이 규칙은 다음 경로들을 ignore 처리할 것이다: # DirectoryA/ # DirectoryB/DirectoryA/ # DirectoryC/DirectoryB/DirectoryA/ # 이 규칙은 DirectoryA 라는 이름의 파일을 ignore 처리하지는 않는다 (해당 파일이 어느 위치에 존재하든 무관) # DirectoryA 라는 이름의 디렉토리 하부에 존재하는 DirectoryB 디렉토리를 ignore 처리하되 # 두 디렉토리 사이에 몇 단계의 다른 경로가 포함되어도 상관없이 ignore 하고 싶다면, # 두 디렉토리 경로 사이에 ** 문자열을 포함시켜 규칙을 작성할 수 있다 DirectoryA/**/DirectoryB/ # 이 규칙은 다음 경로들을 ignore 처리할 것이다: # DirectoryA/DirectoryB/ # DirectoryA/DirectoryQ/DirectoryB/ # DirectoryA/DirectoryQ/DirectoryW/DirectoryB/ # 위에서 이미 살펴 보았듯이, 특정 파일들을 한꺼번에 ignore 처리하리 위해서 규칙 명세에 와일드카드를 이용할 수 있다 # 이 때, '*' 하나를 단독으로 명시할 경우, .gitignore 까지 포함하여 폴더 내의 모든 파일들이 (의도치 않게) ignore 처리되게 된다 # 이렇듯 와일드카드를 사용하되 특정 파일은 ignore 처리하지 않으려면, ! 를 이용하여 예외 처리를 할 수 있다 # 이렇게 예외처리로 명시된 파일은 ignore 목록에서 제외될 것이다: !.gitignore # 파일 이름 중에 해시(#) 문자가 존재할 경우, 백슬래시를 escape 문자로 이용하여 표기할 수 있다 # (1.6.2.1 버전 이후부터 지원) \#*#

대부분의 .gitignore 파일들은 다양한 개발 언어에 따라 표준 규격이 존재하므로, 규칙 설정을 어떻게 시작해야 할지 잘 모르겠을 때에는 sample .gitignore files 에서 언어별 예제 .gitignore 파일을 복사/수정하여 프로젝트에 적용하는 것을 고려해볼 수 있다. 혹은, 새로운 프로젝트의 경우 online tool 을 이용하여 기반이 될 파일을 자동으로 생성해 보는 것도 대안이 될 수 있다.

.gitignore 파일 이외의 방법들

.gitignore 파일은 저장소 내에 커밋하여 포함시키는 것을 기본으로 하는 방법이다. 만약 특정 파일들에 대한 규칙을 저장소에 커밋 없이 ignore 처리하기를 원한다면, 아래와 같이 몇가지 선택지가 존재한다:

  • .git/info/exclude 파일을 수정한다 (.gitignore 파일에서와 동일한 규칙 문법을 사용한다). 기술한 규칙은 해당 저장소 내에 전역으로 적용될 것이다.
  • 로컬의 모든 저장소들에 대해 동일한 ignore 처리를 하고 싶다면 글로벌 gitignore 파일 설정을 해두도록 한다

역주: 글로벌 gitignore 파일은 git config --global core.excludesfile <filepath> 형식으로 설정할 수 있습니다

추가적으로, Git 이 관리중인 (tracked) 파일들에 대한 로컬 변경사항들을 다음과 같은 방법으로 Git 의 글로벌 설정을 변경하지 않고도 ignore 처리할 수 있다:

  • git update-index --skip-worktree [<file>...]: 로컬에만 적용되어야 할 설정파일 수정사항 등이 커밋되지 않도록 설정한다
  • git update-index --assume-unchanged [<file>...]: SDK등과 같이 수정되어서는 안되는 파일들에 대해 변경 검사를 하지 않도록 설정한다

역주: 원문은 위 명령어들에 설명이 각각 "for minor local modifications" 와 "for production ready, non-changing files upstream" 로 되어있으나 아래 링크를 참고해 위와 같이 기술하였습니다.

더 상세한 사항은 마지막에 소개된 두 옵션들간의 차이점 링크에 소개되어 있으며, 그 외에도 더 많은 옵션들은 git update-index documentation 링크에서 확인할 수 있다.

ignore 처리된 파일들 정리하기

git clean -X 명령어를 이용하면 ignore 처리된 파일들을 제거할 수 있다:

git clean -Xn #현재 작업 디렉토리에 존재하는 ignore 처리된 파일들의 목록을 표시한다 git clean -Xf #위 명령어에 의해 나타난 파일들을 삭제한다

Note: -X (대문자) 옵션은 ignore 처리된 파일들만 정리한다. ignore 처리된 파일뿐만 아니라 Git에서 관리하지 않는 (untracked) 파일까지 제거하려면 -x (소문자) 옵션을 사용한다.

더 자세한 사항은 git clean 문서 를 참고하라.

이외에도 gitignore 관련 추가 사항들은 Git manual 링크에서 확인할 수 있다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형

+ Recent posts