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

Section 5.7: 현재 시점 이후의 특정 파일 변경사항들을 ignore 처리하기 (파일을 제거하지 않고)

가끔식은 특정 파일이 Git 에 남아있도록 두면서도 이후에 생길 변경사항들은 ignore 처리되도록 하고 싶을때가 있다.

이런 경우, Git 으로 하여금 해당 파일이나 디렉토리에의 수정 사항을 ignore 처리하도록 update-index 명령을 사용할 수 있다:

git update-index --assume-unchanged my-file.txt

위 명령은 Git 으로 하여금 항상 my-file.txt 이 변경되지 않았다고 가정하여 변경 사항을 확인하거나 표시하지 않도록 설정한다. 물론 해당파일은 저장소 내에 계속해서 존재할 것이다.

이러한 방법은 특정 파일내에 기본값 (defaults) 을 제공하고 각 로컬 환경에서 해당 값을 재설정할 수 있도록 할때 유용하다.

예제:

# 몇가지 값을 저장하고 있는 파일을 하나 생성한다 cat <<EOF MYSQL_USER=app MYSQL_PASSWORD=FIXME_SECRET_PASSWORD EOF > .env # Git 에 해당 파일을 커밋한다 git add .env git commit -m "Adding .env template" # 이제부터 앞으로 .env 에 있을 모든 변경 사항을 ignore 처리한다 git update-index --assume-unchanged .env # FIXME_SECRET_PASSWORD 부분을 사용자의 암호로 변경한다 vi .env # 변경 내역이 검출되지 않는다 git status

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

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

Section 5.6: 규칙을 커밋하지 않고 저장소 내의 특정 파일들을 ignore 처리하기 (.git/info/exclude)

.gitignore 파일을 이용하면 저장소 내의 파일들을 ignore 처리할 수 있긴 하지만, 해당 파일은 본디 저장소에 커밋되어 다른 사용자와 컨트리뷰터들간에 공유하는 것을 기본으로 하는 파일이다. 글로벌 .gitignore 설정을 하는 방법도 있지만, 이 경우에는 사용자의 모든 저장소에 해당 설정이 공유될 것이다.

특정 파일들을 로컬 저장소 내에서만 ignore 처리하되 이 설정이 어떤 다른 저장소에도 포함되지 않기를 바란다면, 해당 저장소 내의 .git/info/exclude 파일을 아래와 같이 수정하라.

예제:

# 아래 파일들은 현재 저장소 내에서만 ignore 처리될 것이다 # 이 규칙은 규칙을 작성한 사용자의 저장소에만 유효하며, # 다른 어떤 사용자와도 공유되지 않을 것이다 gtk_tests.py gui/gtk/tests/* localhost

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

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

Section 5.5: Git 저장소에 이미 커밋 되어있는 파일을 ignore 처리하기

만약 이미 Git 저장소에 추가되어 있는 파일을 더 이상 변경 추적 (track) 하지 않고 싶다면, (앞으로 생성할 커밋들에 해당 파일이 포함되지 않기를 바란다면), 해당 파일을 index 에서 제거할 수 있다:

git rm --cached <file>

역주: 이 방법은 다른 저장소에서 실제 파일 삭제를 유발할 수 있습니다. 실제 적용 전에 하단 설명을 먼저 꼭 읽으세요.

위 명령어는 해당 파일을 저장소에서 제거하여 이후로 해당 파일을 수정하더라도 수정 내역이 Git이 추적하지 않도록 할 것이다. --cached 옵션을 사용함으로서 해당 파일이 실제 사용자의 디스크에서 삭제되지는 않는 것을 보장할 수 있다. 더불어, 기존에 해당 파일에 작업했던 내용 역시 여전히 Git 히스토리상에서 확인할 수 있다.

유의할 점은, Git 의 index 에서 파일을 제거한 후 다른 누군가가 사용자의 저장소에서 pull 을 수행한다면, 해당 명령을 수행한 사용자의 디스크에서는 파일이 실제 삭제될 것이라는 점이다.

위와 같은 방법 대신에, Git 으로 하여금 작업 디렉토리 내의 특정 파일에 대해 index 버전의 파일을 읽음으로써 항상 수정되지 않은 최신 상태라고 가장하도록 하는 (따라서 새로운 수정 사항이 있을지라도 무시하게 되는) "skip worktree" 비트를 아래와 같이 설정할 수 있다:

git update-index --skip-worktree <file>

파일 쓰기 수행은 이 비트에 영향을 받지 않으며, 내용물 보존은 여전히 첫번째 중요 사항이다. 사용자가 해당 파일에 수행한 작업들은 Git 관리에서는 ignore 처리될지라도 변경 내역이 유실되는 경우는 없다. 한가지 단점은, stash 처리와 충돌이 난다는 것이다. (해당 파일을 변경하고 stash 하려고 해도 변경 사항이 없다고 나오기에 stash 처리가 되지 않는다): 이 비트를 다시 해제하려면, 아래와 같이 수행한다

git update-index --no-skip-worktree <file>

때로는 Git 으로 하여금 파일 변경 여부를 검사조차 하지 않은 채로 파일이 변경되지 않았다고 생각하게 만드는 방식이 필요할 때도 있다. 이 방식은 특정 파일을 index 에서 제거할 필요 없이, 해당 파일에 대해 이후로 생길 어떠한 변경사항도 Git 이 ignore 처리하게 설정할 수 있다:

git update-index --assume-unchanged <file>

위 명령어 수행시 파일에 생기는 어떠한 변경 사항도 Git 이 ignore 처리하도록 강제한다. (그러나 해당 파일에 대한 외부 변경 사항을 pull 하거나 파일 자체를 stash 할 경우, 파일에 적용된 모든 변경 사항은 유실됨을 유의하라) Git 으로 하여금 해당 파일을 다시 "관리" 하게 하고싶다면, 아래 명령어를 수행한다:

git update-index --no-assume-unchanged <file>

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

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

Section 5.4: 글로벌 .gitignore 파일 활용하기

Git 으로 하여금 모든 저장소에 대해 특정 파일들을 ignore 하게 설정하고 싶다면 터미널 혹은 명령어 프롬프트에 아래 명령어를 입력하여 글로벌 .gitignore 를 설정할 수 있다:

$ git config --global core.excludesfile <Path_To_Global_gitignore_file>

위 명령어 수행 시, Git 은 각 저장소 내의 .gitignore 파일과 더불어 해당 글로벌 .gitignore 파일을 ignore 처리에 사용할 것이다. 두 파일 사이에 적용되는 규칙은 다음과 같다:

  • 만약 저장소 내의 로컬 .gitignore 파일이 특정 파일을 명시적으로 예외 처리 (include) 하고 있지만 글로벌 .gitignore 파일에서는 ignore 처리하고 있다면, 저장소 내의 로컬 .gitignore 파일이 우선 순위를 가진다 (해당 파일은 ignore 되지 않을 것이다)
  • 만약 해당 저장소가 여러 컴퓨터에 clone 되어 있다면, 글로벌 .gitgignore 파일은 해당 컴퓨터들 전체에서 모두 로드되어 있거나 최소한 포함이라도 되어 있어야 한다. 그렇지 않다면 일부 컴퓨터에서는 글로벌 .gitignore 에 의해 ignore 처리되어 update 되지 않을 파일들이 다른 컴퓨터에서는 저장소에 push 되어 clone 된 저장소간의 불일치를 야기할 것이기 때문이다. 이러한 연유로, 팀 단위의 프로젝트 진행 시에 각 저장소별 .gitignore 파일 사용이 글로벌 .gitignore 보다 더 나은 대안이라고 할 수 있다.

이 글로벌 .gitignore 파일은 플랫폼, 기기 혹은 사용자별로 특화된 파일들을 ignore 처리하기에 적합하다. (예: OSX 의 .DS_Store, Windows 의 Thumbs.db 파일과 Vim 의 *.ext~ 와 *.ext.swp 등의 파일들을 저장소에 추가하지 않고 싶은 경우)

따라서, 팀 멤버 중 OS X 에서 개발 중인 팀원은 .DS_STORE 와 _MACOSX (실제 대부분 불필요한 파일들이다) 파일들을 글로벌 .gitignore 에 등록하고, Windows 에서 작업중인 다른 팀원은 thumbs.bd 파일들을 모두 ignore 처리하는 등의 활용이 가능하다.

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

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

Section 5.3: .gitignore 파일에서 예외처리하기

패턴을 통해 파일들을 ignore 처리하던 중, 일부 파일에 대해서는 예외 처리를 하고싶다면, 느낌표(!) 를 접두어로 기입하여 예외 처리를 할 수 있다. 예를 들어:

*.txt !important.txt

위 예제는 Git 으로 하여금 important.txt 라는 이름을 가진 파일을 제외한 모든 .txt 확장자를 가진 파일들을 ignore 처리하는 방법을 나타내고 있다.

만약 예외 처리하고자 하는 파일들이 ignore 처리된 폴더 내에 존재한다면, 생각처럼 손쉽게 다시 Git 에 포함시킬 수 없다:

folder/ !folder/*.txt

위 예제에서는, 폴더 내의 모든 .txt 파일들이 여전히 ignore 처리된 채로 남아있을 것이다.

Git으로 하여금 원하는 파일들을 다시 포함시키는 올바른 방법은, 우선 별도 라인에 ignore 처리된 폴더 자체를 먼저 예외처리 시키고, 해당 폴더 내의 모든 파일들을 * 을 이용하여 ignore 처리한 이후에, 최종적으로 다시 *.txt 파일들을 예외 처리하여 Git 에 포함시키는 것이다. 다음 예제를 참고하라:

!folder/ folder/* !folder/*.txt

Note: 느낌표로 시작하는 이름을 가진 파일의 경우에는, 느낌표 두개를 붙이거나 아니면 \ 문자를 이용하여 escape 처리하면 된다:

!!includethis \!excludethis

역주: !!includethis 규칙은 패턴에 의해 ignore 처리되었을 수도 있는 !includethis 파일을 Git으로 하여금 예외 처리하여 Git 관리 목록에 포함시키라는 규칙입니다.

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

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

Section 5.2: 특정 파일이 ignore 처리되어 있는지 확인하기

git check-ignore 명령어는 어떤 파일들이 Git 에서 ignore 처리되어 있는지 알려준다.

커맨드라인에서 파일 이름들을 인자로 넘기면, git check-ignore 는 그 중에서 ignore 처리된 파일 이름들을 나열해줄 것이다. 예를 들어:

$ cat .gitignore *.o $ git check-ignore example.o Readme.md example.o

이 예제에서, .gitignore 에는 *.o 파일들만 기술되어 있으므로, 인자들 중 Readme.md 파일은 git check-ignore 의 실행 결과에 나오지 않게 된다.

만약 .gitignore 의 어느 줄이 특정 파일의 ignore 처리에 영향을 미쳤는지 확인하고 싶다면, git check-ignore 명령어에 -v 옵션을 추가하면 된다:

$ git check-ignore -v example.o Readme.md .gitignore:1:*.o example.o

Git 1.7.6 버전부터는 git status --ignored 명령어를 이용하여 ignore 처리된 파일들을 확인할 수 있게 되었다.

관련 추가 정보는 git status 공식 문서 및 "5.12: .gitignore 에 의해 ignore 처리된 파일 검색하기" 섹션에서 얻을 수 있다.

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

반응형
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)

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

Chapter 5: 파일들과 폴더들이 Git 에 포함되지 않도록 (ignore) 설정하기

이번 챕터에서는 원치 않는 파일들 (혹은 파일 변경 사항들)이 Git 저장소에 추가되지 않도록 설정하는 방법에 대해 다룬다.

이를 위해서는 몇가지 방법을 사용할 수 있지만 (전역 혹은 로컬 .gitignore 파일, .git/exclude 파일, git update-index --assume-unchanged 명령어, 그리고 git update-index -- skip-tree 명령어 등), 한가지 염두에 둘 것은 Git 은 내용물을 관리하는 시스템이라는 것이다: ignore 설정은 실제로는 폴더 내의 내용물 (예:파일들) 에 대해서만 적용된다. 비어있는 폴더는 Git 에 어차피 추가 자체가 불가능하기 때문에, 기본적으로 ignore 처리될 것이다.

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

반응형

+ Recent posts