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

Section 5.11: 비어있는 폴더 커밋하기

Git 에서는 커밋을 단순화하고 속도를 빠르게 하기 위해 내용물을 파일 단위로 관리하고 디렉토리 정보는 해당 파일에 연관된 정보로 해석하기 때문에, 파일이 없는 빈 파일은 추가 및 커밋을 할 수 없다. 이러한 문제를 피해가기 위해서는 두가지의 방법이 있다:

첫번째 방법 : .gitkeep

첫번째 우회 전략은 .gitkeep 파일을 사용하여 폴더를 Git 에 등록하는 것이다. 이 방법을 사용하기 위해서는 필요한 디렉토리를 만든 후 해당 디렉토리 안에 간단히 .gitkeep 파일을 만들어 추가하기만 하면 된다. 이 파일은 내용이 없이 빈 파일로써 해당 디렉토리를 Git 에 등록하는 것 외에는 다른 어떤 목적도 없는 파일이다. Windows 의 경우에는 (기본적으로 이러한 파일 네이밍 규칙이 허용되지 않는) git bash 를 열고 다음과 같이 명령어를 입력한다:

$ touch .gitkeep

이 명령어는 현재 디렉토리 내에 비어있는 .gitkeep 파일을 생성할 것이다.

두번째 방법: dummy.txt

두번째 방법은 첫번째 방법과 매우 유사하며, .gitkeep 파일 대신 dummy.txt 라는 파일로 대체한다는 점만 유의하여 위에서 설명하였던 순서를 그대로 따라 수행하면 된다. 첫번째 방법에 비해 추가적으로 얻을 수 있는 장점으로는 Windows 에서도 컨텍스트 메뉴를 통해 쉽게 해당 파일을 생성할 수 있다는 점이다.

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

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

Section 5.10: 서브디렉토리의 파일들 ignore 처리하기 (다중 .gitignore 파일 사용)

사용자의 저장소가 다음과 같은 계층 구조를 가지고 있다고 가정할 경우:

examples/ output.log src/ <기타 등등 파일들> output.log README.md

examples 디렉토리 아래 존재하는 output.log 파일은 프로젝트 이해도 증진을 위해 필요한 실제적으로 유효한 파일이지만, src 디렉토리 아래에 있는 파일은 디버깅시에 생성된 파일로서 Git 히스토리에 남거나 저장소에 포함외어서는 안되는 파일이다.

이 파일을 ignore 처리하기 위해서는 크게 두가지의 방법이 있다. Git 저장소 최상위 디렉토리의 .gitignore 파일에 아래와 같이 절대 경로를 명시하여 ignore 처리할 수 있으며:

# /.gitignore src/output.log

다른 방법으로는 src 디렉토리에 .gitignore 파일을 만들고 해당 파일에 대한 상대 경로를 명시하여 파일을 ignore 처리할 수 있다:

# /src/.gitignore output.log

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

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

Section 5.9: 미리 만들어진 .gitignore 템플릿 사용하기

만약 .gitignore 파일에 어떠한 규칙을 기술하여야 할지 확실치 않거나, 일반적으로 많이 사용되는 ignore 규칙들을 추가하고 싶다면, 아래와 같은 링크에서 미리 만들어진 .gitignore 파일을 고르거나 새로운 규칙을 생성할 수 있다:

https://www.gitignore.io/
https://github.com/github/gitignore

GitHub 나 BitBucket 같은 Git 호스팅 서비스에서도 아래와 같이 프로그래밍 언어와 사용하는 IDE에 따른 .gitignore 파일 생성 기능을 제공한다:

.gitignore generation

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

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

Section 5.8: 특정 파일을 모든 서브디렉토리에서 ignore 처리하기

foo.txt 라는 이름의 파일을 디렉토리 위치에 관계없이 ignore 처리하고 싶다면 해당 파일의 이름만 ignore 규칙에 기술하면 된다:

foo.txt # 어떤 디렉토리에 있건 파일 이름이 'foo.txt' 인 파일은 모두 ignore 처리된다

파일을 디렉토리 계층 구조 내의 일부에서만 ignore 처리하고 싶다면 ** 패턴을 이용하여 특정 디렉토리의 하부 디렉토리를을 대상으로 지정할 수 있다:

bar/**/foo.txt # 'foo.txt' 라는 이름을 갖는 파일이 'bar' 디렉토리와 그 하부 디렉토리들에 존재할 경우 모두 ignore 처리한다

다른 대안으로, .gitignore 파일을 bar/ 디렉토리 안에 생성하는 방법도 있다. 위 예제와 동일한 효과를 내려면 아래 내용으로 bar/.gitignore 파일을 생성하면 된다:

foo.txt # bar/ 디렉토리 하부의 어떤 디렉토리던지 'foo.txt' 이름을 갖는 파일이 있다면 모두 ignore 처리된다

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

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

반응형

+ Recent posts