xho95 (소중한꿈)'s Swift Life

Git 을 사용하면 파일들의 버전 관리를 할 수 있어 편리하지만,1 가끔씩 원하지 않는 파일들까지 관리하려고 하는 불편함이 생기기도 합니다. 가장 대표적인 경우가 개발 과정에서 부산물로 생기는 임시 파일들을 추적하게되는 경우입니다. 이러한 임시 파일들에는 프로젝트의 설정 파일, 빌드 과정에서 생기는 object 파일들이 있습니다.

버전 관리에서 제외하고 싶은 파일들을 Git의 변경 내력 추적에서 제외하려면 .gitignore 파일을 만들면 됩니다. 2 Git은 해당 폴더의 .gitignore 파일에 적혀있는 파일들을 버전 관리에서 제외합니다. 3

macOS 에서 파일 이름 앞의 .은 숨김 파일을 의미합니다. 따라서 .gitignore 파일은 보통은 보이지 않으며 터미널에서 $ ls -al 같은 명령을 입력해야 볼 수 있습니다. 이는 .gitignore 파일을 함부로 고치는 것을 막기 위한 조치로 보입니다.

.gitignore 파일에 기록할 내용들은 개발자마다 다르고 개발 언어마다 다르겠지만, GitHub 에서 친절하게 사실상 거의 모든 언어에 대한 .gitignore 파일을 미리 만들어서 github/gitignore 라는 저장소(repository)에 올려 두었습니다. 4 따라서 우리는 이 자료를 고맙게 사용하면 됩니다.

보통은 이 자료를 그대로 사용해도 문제가 없으며, 제 개인적으로도 현재까지 GitHub에 있는 .gitignore 파일을 그대로 사용해서 문제가 생겼던 적은 없었습니다.

.gitignore 파일 만들기

.gitignore 파일은 종류에 상관없이 자신이 사용하는 에디터로 .git 파일이 존재하는 곳과 같은 폴더에 만들어 주면 됩니다. 파일의 내용은 앞서 말씀드린 github / gitignore 저장소에서 자신에게 필요한 파일을 찾고 해당 내용 중에서 필요한 부분만 복사해서 사용하면 됩니다.

.gitignore 파일의 내용을 직접 작성하고자 한다면 https://git-scm.com/docs/gitignore 글에서 작성 방법을 참고하면 됩니다. Git 문서의 경우 많은 문서가 이미 한글로 번역되어 있는데, 이 문서의 한글 버전은 아직 찾지 못했습니다.

Xcode 및 Swift 를 위한 .gitignore 파일 만들기

Xcode 및 Swift 개발 과정에서 .gitignore 파일에 작성해야 할 내용은 github/gitignore 저장소의 Swift.gitignore 파일에 정리되어 있습니다.

또 github/gitignore 저장소에 가보면 Swift.gitignore 파일외에도 하위 폴더인 Global 폴더에 Xcode.gitignore 파일이 따로 존재하는 것을 볼 수 있습니다. 5

확인해 봤을 때, Swift.gitignore 파일은 Xcode.gitignore 파일의 내용을 모두 포함하고 있는 것 같으므로, 실제로는 Swift.gitignore 파일만 사용하면 될 것 같습니다. 6

이제 자신의 .git 이 있는 폴더에 가서 .gitignore 파일을 만들고 내용을 Swift.gitignore 파일 처럼 만듭니다. 아니면 Swift.gitignore 파일을 다운받고 이름을 .gitignore 로 바꿔도 됩니다.

저는 $ vi .gitignore 명령을 사용하여 파일을 만들고, Swift.gitignore 파일의 내용을 복사하는 편입니다.

Python 및 장고(Django) 의 경우

Python 의 경우, github/gitignore 저장소에 있는 Python.gitignore 파일을 사용하면 되는데, 이 파일에는 장고(Django) 와 관련한 부분도 이미 있습니다.

다만 장고의 경우, 장고 개발팀이 직접 GitHub 의 django/django 라는 저장소에 소스를 올려두었는데, 여기에 있는 .gitignore 파일을 참고해도 좋을 것 같습니다. 7

.gitignore 파일로 제외할 수 없는 파일 제외하기

.gitignore 은 앞으로 Git 버전 관리에서 제외할 파일 목록을 지정하는 파일입니다. 따라서 이미 버전 관리에 포함되어 있는 파일들을 .gitigore 파일에 기록한다고 해서 Git이 알아서 버전 관리에서 제외 하지는 않습니다.

이럴 경우에는 수동으로 해당 파일들을 버전 관리에서 제외시켜줘야 합니다. Git 버전 관리에서 수동으로 파일을 제외하려면 아래와 같이 $ git rm --cached 명령어를 사용합니다.

$ git rm --cached .../UserInterfaceState.xcuserstate

위의 예제는 Xcode의 레이아웃 관리 파일을 제거하는 예제입니다. 8 $ git rm 명령을 사용하면 실제 파일도 삭제하지만, $ git rm --cached 명령을 상요하면 실제 파일은 삭제하지 않고 Git의 버전 관리에서만 제외한다는 의미를 가집니다. 9

그리고 위의 명령을 실행한 다음에 이어서 아래와 같이 commit 까지 해주면 Git에서 해당 파일을 버전 관리에서 제외합니다. 10

$ git commit -m "some message"

$ git rm --cached 만 하고 commit 을 하지 않으면, 아직 staged 상태라 버전 관리에서 완전히 빠지지 않으므로 깜빡하지 않도록 주의가 필요합니다.

고찰 하기

.gitignore 에 기록되는 파일들이 어떤 의미를 가지고 있는지 정리할 필요가 있을 것 같습니다. 예를 들어, .dSYM 파일은 무슨 역할을 하는 파일인지 왜 버전 관리에서 제외해야 하는지 살펴볼 필요가 있을 것 같습니다.

각각의 파일들에 대해서 더 깊게 안다면 자신의 상황에 맞게 .gitignore 파일을 최적화할 수 있을 것입니다.

일단 참고 자료에 따르면 .dSYM 파일은 Debug Symbols file 의 줄임말로 앱의 디버그 심볼들을 저장하는 파일이라고 합니다. 11 아직까지는 설명을 봐도 감이 잘 오지 않는 것 같습니다.

나중에 기회가 되면 Xcode 프로젝트 관련 파일들에 대해서도 정리하도록 할 예정입니다.

아울러, .gitignore 파일을 동시에 여러 개를 사용해도 되는지에 대해서도 알아볼 필요가 있을 것 같습니다.

변경 사항

참고 자료

  1. git : Git으로 검색하면 이곳이 공식 홈페이지라고 뜹니다. 

  2. 샤코님의 블로그 글, Xcode에서 git 사용할 때, 필요 없는 파일을 무시하려면?을 보면 Xcode에서는 Xcode 4 버전부터 Git으로 버전 관리를 함을 알 수 있습니다. 

  3. 온라인에 공개된 ProGit 책의 2장 파일 무시하기 부분을 보면 .gitignore에 대한 설명이 잘 나와있습니다. Git 관련 설명은 이 책보다 좋은 자료가 없는 것 같습니다. 언젠가 기회가 되면 간단하게 Git 사용법에 대한 내용도 정리해 볼 예정입니다. 

  4. GitHub의 github/gitignore 저장소(repository)에는 Swift 뿐만 아니라 현존하는 거의 모든 프로그래밍 언어와 프로그래밍 도구에서 필요한 .gitignore 파일이 정리되어 있습니다. 괜히 GitHub가 아닌 것 같습니다. 

  5. Swift.gitignore 파일은 github/gitignore/Swift.gitignore 이며, Xcode.gitignore 파일은 gitignore/Global/Xcode.gitignore 입니다. 

  6. 동시에 여러 개의 .gitignore 파일을 사용할 수 있는지는 아직 확인을 못 했습니다. 저는 Swift.gitignore 파일의 내용만 사용했지만 현재까지 별 문제는 없었습니다. 

  7. django/django : 파이썬으로 개발된 웹 프레임웍인 장고의 GitHub 저장소입니다. 

  8. 토미님의 블로그 글 gitignore로 tracking 제외할 수 없는 파일 제외하기을 보면 UserInterfaceState .xcuserstate 파일은 Xcode 프로젝트의 워크스페이스나 프로젝트 네비게이션 바에서 도큐먼트 레이아웃 정보를 관리하는 파일이라고 합니다. 즉, 우리가 Xcode에서 특정 파일을 열어 보기만 해도 변경되는 파일이라고 볼 수 있습니다. 

  9. ProGit 책의 2장 파일 삭제하기 부분을 보면 git rmgit rm --cached 명령에 대해서 설명이 잘 되어 있습니다. 

  10. 아사타님의 블로그 글 github에서 ignore 안되는 파일 제거하기~~~에 설명이 되어 있습니다. 

  11. 이 부분은 The LLDB Debugger라는 사이트에 설명이 되어 있습니다. 당장은 크게 둘러보고 싶지는 않지만 언젠가는 LLDB 부분도 볼 날이 오지 않을까 생각합니다.