본문 바로가기

프로그래밍/기타

.gitignore 사용하기

.git을 사용하다 보면, commit 하길 원하지 않는 파일이 생길 때가 있다. 이런 경우 .gitignore을 사용하면 쉽게 파일들을 관리할 수 있다. 나의 경우에는 개인 정보(URL 또는 비밀 번호 등)가 GitHub와 같은 온라인 원격 저장소에 commit 되는 것을 원하지 않아서 .gitignore을 사용할 필요성을 느꼈다. 

 

다시 말해, 컴파일을 하는데에 있어 개인 정보가 저장된 파일이 필요하지만 해당 파일을 GitHub에 공유되는 것은 원하지 않아 .gitignore을 사용하였다. 

 

사용 방법은 어렵지 않지만 처음 할 때 많이 헤맸다. 특히 Xcode에서 제공하는 GUI 기반의 git을 함께 사용하면 무언가 잘못했는지 모르지만, 계속해서 오류가 발생했다. 그래서 cache를 제거하고 commit 할 때까지는 Terminal을 이용하는 것을 추천한다. 

 

먼저 test 폴더를 생성하고 그 안에  a 폴더를 생성했다. 그리고 그 안에 .txt 파일 두 개를 생성하였다. (.txt 파일의 내용은 상관없다)

 

 

그리고 아래와 같이 git을 생성시키고 커밋까지 해준다. 

이 상황에서 sample1.txt 파일을 앞으로의 commit에서 무시하고자 한다면, 다음과 같이 test 폴더의 경로에서 vim을 이용해 .gitignore를 생성시켜 준다. 

그럼 다음과 같이 editor 창이 나오고, i를 눌러 다음과 같이 입력한다. 여기서 "#"로 시작하는 문자열은 주석이라 무시되고, 일반 문자열로 입력한 파일(a 폴더의 sample1.txt 파일)은 commit에서 무시한다는 의미이다. 

그다음 esc를 누른 뒤 :wq를 입력하고 enter를 입력하면 .ignore 파일에 입력한 텍스트가 저장되고 editor 창이 종료된다. 

그리고 아래와 같이 commit 한다. 

 

그리고 이제 sample1.txt 파일을 수정한 뒤에 git status를 통해 상태를 조회해 보자. 그럼 아래와 같이 sample1.txt 파일이 수정되었다고 나오게 되는데, 이건 우리가 원하는 상태가 아니다. 왜냐하면 .gitignore 파일에서 commit을 무시하고자 한 파일을 정해주었는데, git이 해당 파일의 상태가 변한 것을 인식하였기 때문이다. 

해당 현상은 기존에 이미 commit 된 파일에 대해 나타나는데, 다음과 같이 해당 파일에 대한 원격 저장소의 cache를 지워 해결할 수 있다. 

먼저 git reset --hard를 통해 수정된 sample1.txt 파일을 되돌리고, git rm --cache a/sample1.txt를 통해, 원격 저장소의 cache를 지워준다. 

그러면 다음과 같이 sample1.txt 파일이 삭제된 것을 확인할 수 있지만 a폴더에는 그대로 남아 있게 된다. 그다음 commit 한다. 

 

참고로 Xcode를 사용하는 경우, 여기까지 Terminal을 이용하는 것을 추천한다. cache 파일을 삭제하고, Xcode를 이용하여 commit을 하려고 하였는데, 해당 부분에서 정상적으로 동작을 하지 않았다. 

이 단계까지 Terminal을 이용하면 이후에는 문제없이 Xcode를 이용해 commit 할 때도, 수정된 파일을 정상적으로 무시했다. 

이제 sample1.txt 파일을 수정하고 다시 상태를 조회하면 아래와 같이 나온다. 

분명 .txt 파일을 수정하였지만, git은 해당 파일을 commit에서 제외하게 된다. 이렇게 나의 로컬 저장소에는 해당 파일이 남아 있어 그대로 수정하면서 사용할 수 있지만, 원격 저장소에는 이전에 git rm --cache를 통해 지웠기 때문에, 공개를 원하지 않는 정보를 감출 수 있다. 

 

이와 같이 .gitignore 파일을 사용할 수 있다. 이번 예제와 같이 여러 단계를 거치는 경우는 앞에서 말한 것처럼 이미 commit 된 파일에 대해 해당한다. 따라서 commit 전에 .gitignore 파일에 commit을 원치 않는 파일을 등록하면 위와 같은 단계를 거치지 않아도 된다. 파일을 등록하는 여러 방법이 있지만, 인터넷에서 쉽게 찾을 수 있어 생략하겠다.