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

Section 5.15: .gitignore 에 추가하기 전에 이미 커밋되어 있던 파일들 정리하기

가끔은 Git 에 의해 추적 관리되던 (tracked) 파일을 나중에 관리를 중단하기 위하여 .gitignore 에 추가하게 되는 경우가 생긴다. 이런 경우, .gitignore 에 추가하기 전에 해당 파일들을 정리하는 것을 간과하기가 쉬워, 결과적으로 해당 파일들이 저장소 내에 여전히 존재하게 된다.

이러한 문제를 해결하기 위해, 저장소 내의 모든 파일을 임시로 ("dry-run") 제거한 후 다시 전체 파일들을 추가하는 방법을 사용할 수 있다. 반영 대기중인 변경사항이 없고 --cached 옵션이 사용되었다면, 파일을 제거하고 추가하는 이 작업은 비교적 안전하다고 간주할 수 있을 것이다:

# index 에서 모든 파일들을 제거한다 (실제 파일시스템에서는 제거되지 않고 남아 있을 것이다 $ git rm -r --cached . # 다시 전체를 추가한다 (변경된 부분이 있다면 해당 부분이 포함된 현재 상태 그대로 추가된다) $ git add . # 변경 사항이 있다면 커밋을 수행한다. 변경 사항은 파일이 제거된 내역만 존재하여야 할 것이다. $ git commit -m 'Remove all files that are in the .gitignore' # 원격 저장소를 업데이트 한다 $ git push origin master

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

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

Section 5.14: 변경사항이 이미 추적되고 있는 (tracked) 파일의 변경 사항 ignore 처리하기

.gitignore 와 .git/info/exclude 는 오직 Git에 의해 변경 사항이 추적되지 않는 (untracked) 파일들에 대해서만 동작한다. 이미 변경사항이 추적되고 있는 (tracked) 파일에 ignore 처리 플래그를 설정하려면, update-index 명령어를 이용한다:

git update-index --skip-worktree myfile.c

원래 상태로 되돌리려면, 아래와 같이 수행한다:

git update-index --no-skip-worktree myfile.c

아래 예제를 글로벌 git config 파일에 등록해 두면 보다 손쉬운 git hide, git unhide, 그리고 git hidden 명령어를 사용할 수 있게 된다:

[alias] hide = update-index --skip-worktree unhide = update-index --no-skip-worktree hidden = "!git ls-files -v | grep ^[hsS] | cut -c 3-"

update-index 명령어는 또다른 옵션인 --assume-unchanged 도 제공한다

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

만약 위와 같이 설정한 파일에 대해 다시 변경 사항을 추적하고 싶다면, 아래와 같이 수행한다.

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

파일에 --assume-unchanged 플래그를 표기하는 것은, 사용자가 해당 파일을 변경하지 않겠다고 약속하여 Git으로 하여금 작업 디렉토리에 있는 파일이 항상 index 에 기록된 파일과 동일하다고 간주할 수 있도록 허용하는 것이다. 만약 Git 이 해당 파일을 index 에서 수정하여야 하는 경우, (예를 들어 커밋을 merge 하는 경우로 인한 상황 등) 작업이 실패할 수 있다; 그러므로, assumed-unchanged 처리한 파일이 upstream 에서 변경된 경우에는 사용자가 직접 문제 상황을 해결해야 한다. 이 옵션을 사용하는 주 목적은 파일 변경 확인 작업을 건너뛰어 성능상의 개선을 꾀하는 것이다.

반면에 --skip-worktree 플래그는 Git 으로 하여금 특정 파일이 로컬에서만 변경될 것이기 때문에 실수로라도 변경 사항이 커밋되지 않도록 하고 싶을 때에 (특정 환경을 위하여 존재하는 설정 파일 등) 해당 파일을 건드리지 않도록 유용하게 사용할 수 있다. 두 옵션이 한꺼번에 사용된 경우는, --skip-worktree 옵션이 --assume-unchanged 옵션보다 우선 순위를 가지게 된다.

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

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

Section 5.13: 파일 내의 일부분만 ignore 처리하기

가끔씩은, 파일 내에 커밋하거나 외부에 공개하고 싶지 않은 로컬 변경사항들이 있을 수 있다.

원칙적으로 로컬 설정값 등은 .gitignore 에 의해 처리될 수 있는 별도의 파일로 묶여있는 것이 가장 좋으나, 가끔씩은 단기적인 방법으로 이미 저장소에 포함된 파일 내에 사용자 로컬에만 해당하는 변경내역을 유지하는 것도 유용할 수 있다.

clean filter를 이용하면 Git 으로 하여금 이러한 수정된 라인을 "못 본체하게" 설정할 수 있다. 이 라인들은 diff 상에도 아예 나타나지 않을 것이다.

file1.c 이라는 이름의 파일 내용이 아래와 같다고 가정하면:

struct settings s; s.host = "localhost"; s.port = 5653; s.auth = 1; s.port = 15653; // NOCOMMIT s.debug = 1; // NOCOMMIT s.auth = 0; // NOCOMMIT

NOCOMMIT 이라고 주석을 단 라인은 다른 어떤 곳에도 공개되지 않기를 바랄 것이다. .git/config 과 같은 Git config 파일에 아래 내용을 기입하여 새로운 "nocommit" 이라는 filter 를 추가하도록 한다:

[filter "nocommit"] clean=grep -v NOCOMMIT

이제 이 필터를 .git/info/attributes 혹은 .gitmodules 설정을 통해 원하는 파일에 적용한다:

file1.c filter=nocommit

이제 사용자가 작성한 NOCOMMIT 라인들은 Git 에서 숨겨진 채 관리될 것이다.

주의 사항:

  • clean filter 사용 시 (특히 Windows 에서) 파일 처리 속도 저하를 가져올 수 있다.
  • ignore 처리된 라인은 Git 이 파일을 업데이트 하는 경우 수정한 사항이 사라질 수 있다. smudge filter 를 이용하면 이러한 현상을 막을 수는 있으나, 설정이 더욱 복잡해진다.
  • Windows 에서는 충분히 테스트되지 않은 방법이다.

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

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

Section 5.12: .gitignore 파일에 의해 ignore 처리된 파일들 검색하기

현재 디렉토리에서 ignore 처리된 모든 파일들의 목록은 아래 명령어를 통해 조회할 수 있다:

git status --ignored

만약 아래와 같은 구조의 저장소를 가지고 있으며:

.git .gitignore ./example_1 ./dir/example_2 ./example_2

....gitignore 파일 내용이 아래와 같은 경우:

example_2

...아래 명령어에 대한 결과물은 다음과 같이 나올 것이다:

$ git status --ignored On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore .example_1 Ignored files: (use "git add -f <file>..." to include in what will be committed) dir/ example_2

만약 하부 디렉토리에 있는 ignore 처리된 파일들까지 재귀적 (recursively) 으로 모두 출력하고 싶다면, --untracked-files=all 파라미터를 추가하여야 한다.

해당 파라미터를 사용한 결과는 아래와 같다:

$ git status --ignored --untracked-files=all On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore example_1 Ignored files: (use "git add -f <file>..." to include in what will be committed) dir/example_2 example_2

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

반응형
본 문서는 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)

반응형

+ Recent posts