gitignore

양치는 하셨나요·2024년 7월 16일
0
post-thumbnail

지난 글에서 Git과 Git workflow에 대해 작성했었다. 이에 대해 간략히 설명하자면

  • Git은 분산 버전 관리 시스템으로 파일의 변경 사항을 기록하고 이런 기록들을 다양한 곳에 저장하고 공유하면서 개발의 공간적, 시간적 제약을 해소할 수 있게 해주는 시스템이다.
  • 이러한 Git은 변경사항의 방향성에 따라 branch를 나누고 합치는 과정으로 프로젝트를 발전 시킬 수 있는데 이렇게 발전 시키는 것을 사람들과의 약속을 통해 규칙을 정해둔 것이 Git Workflow이다.

이와 같다.

Git을 사용해 보면 Git으로 추적을 시작한 폴더 내의 파일들이 전부 Staging Area(추적 대상으로 설정된 대상을 모아둔 구역)로 올라가게 되는데 이때 몇몇 문제점들이 발생하게 된다.

이럴 때 gitignore 파일을 사용해 Unstage 상태로 바꿔야 문제점들을 해결할 수 있기 때문에 gitignore를 사용한다. 그렇다면 gitignore는 어떤 것인지 한번 알아보자.


gitignore

먼저 단어의 뜻을 살펴보자.

  • ignore: 무시하다 배제하다, 모른 체 하다

단어의 뜻에서 알 수 있듯 gitignore는 Git이 ignore해야 하는 것들, 즉 git이 무시해야 하는 파일들을 기입하는 곳이다. 정확한 개념부터 살펴보자.

개념

  • Git 버전 관리에서 제외할 파일 목록을 지정하는 파일.
  • .gitignore 라는 이름의 파일로 기입되며 txt 파일과 같은 형식의 파일이다.
  • 내부에는 제외하고자 하는 파일, 폴더 등이 기록되어있다.

사용법

Git은 기본적으로 유닉스의 Shell과 같은 형식이기 때문에 유닉스의 문법을 따른다. 따라서 기본적으로 아래와 같은 방식으로 지정 가능하다.

  • 특정 파일 지정

    Test.txt
  • 현재 경로의 특정 파일 지정

    /Test.txt
  • 폴더 지정

    /test
    /test/testInTest
  • 특정 경로 내의 파일 지정

    /test/TestInTest.txt
  • 특정 확장자를 가진 파일 지정

    *.txt
  • 폴더 내의 모든 파일들 중에서 지정하기

    /**/Test.txt
  • 폴더 내의 모든 파일들 중에서 지정하기

    #아래에는 귀여운 고양이 사진이 있다. 이 사지는 나만 볼 수 있기 때문에 제외한다. 
    # _추가. 아니. 나도 볼것이기 때문에 제외를 제외한다. 
    #/cuteCat/*.[jpg,JPG,jepg,png]

Globs(Glob Patterns)

위의 사용법에서 볼 수 있듯 Git은 유닉스의 기초 문법들을 따라간다. 이때 이런 문법이 무엇인지 모를 수 있기 때문에 간단히 설명 하고 넘어가고자 한다.

  • Globs는 오래전부터 유닉스(현재는 리눅스) 운영체제에서 폴더와 파일을 지정할 때 사용하는 패턴 매칭 기법이다. 이런 매칭 기법은 단순히 파일과 폴더를 지정 하는 것이 아니라 특정 부분이 공통되거나 하위의 모든 파일을 탐색하는 등 다양한 것을 할 수 있다.
  • 절대 경로와 상대 경로 이때 우리는 폴더와 파일 명을 두 가지 방식으로 표현 가능하다.
    • 절대경로: 폴더나 파일이 위치해 있는 장소를 최상위폴더로부터 차례차례 나타낸 것이다. 예를 들어 Download 폴더의 위치는

      C:\Users\"사용자_이름"\Downloads

      와 같이 나타낼 수 있다.

    • 상대경로: 마찬가지로 폴더나 파일의 위치를 나타내는데 이를 현재 내가 위치하고 있는 폴더의 위치를 바탕으로 나타낸다. 가령 내가 Downloads 폴더 안에 있는 test 폴더 안의 Test.txt 파일을 보고 싶다고 한다면

      ```
      .\text\Test.txt
      ```

      처럼 나타낼 수 있는 방식의 경로이다.

      이런 경로들을 표시할 때 다양한 기호들을 사용하는데, 아래와 같은 문법으로 사용한다.

      . : 현재 디렉토리의 이름을 대체한다. 
      		Test.txt 처럼 쓰여있는 위치가 있다면 이는 ./Test.txt를 간단히 쓴 것이다. 
      		
      .. : 이전 디렉토리를 뜻한다. 현재 디렉토리보다 한 칸 상위의 디렉토리는 
      		../ 와 같이 쓰인다. 
      		
      /  : 폴더를 나타낸다.  
      
      !  : 제외해야 하는 것을 나타낸다. !Test.txt 라고 하면 현재 경로 내의 
      		Test.txt를 빼라는 뜻이다. 
      		
      ?  : 물음표가 있는 칸에 어떤 문자(공백도 포함)가 와도 상관 없다는 뜻이다. 
      		Te?t.txt는 Test.txt도 되고 Text.txt도 된다. 
       
      '*' : 크기 상관 없이 모든 문자를 뜻한다. *.txt 라고 하면 .txt로 끝나는
      		모든 문자 (.txt / aa.txt 와 같이) 를 의미한다
      **  : 이는 / 와 같이 쓰는데 /**/와 같이 쓰면 첫 / 에 해당하는 폴더의 모든 하위 경로의 
      		파일들 모두를 포함하라는 뜻이다. Downloads/**/*.txt 는 다운로드 폴더 안의 모든
      		.txt 로 끝나는 파일들을 하위폴더의 내부까지 다 포함하라는 뜻이다.  
      		
      {}  : 중괄호는 해당 칸에 들어갈 단어를 여러개 지정 하고 싶을 때 사용한다. 
      		{haha, Test}.txt 라고 하면 haha.txt 와 Test.txt 두 파일을 지정한다. 
      		
      []  : 대괄호는 해당 칸에 들어갈 문자 하나를 지정할 때 사용한다. 이때 - 를 이용해 
      		범위로도지정이 가능하다. [abc] 는 a, b, c 를 의미하고 [A-Z]는 
      		A 부터 Z 까지의 문자를 의미한다. 또한 !와 같은 문자를 활용해 
      		[!A-Z]처럼 해당 칸에 대문자를 포함하지 않는다는 뜻 처럼도 사용 가능하다. 
      		
      () 	: ? 뒤에 온다면 빈칸 혹은 지정 단어 둘 중 하나를 의미하고 ?(ab|cd) -> ab or cd
      		* 뒤에 오면 해당 단어로 시작하는 폴더나 파일을 의미한다.  *(ab|cd) -> ab, cd, ...
      		이때 예시와 같이 | 를 이용해 or을 표시할 수도 있다. 

gitignore 유의사항

  • gitignore 파일에 제외 대상 폴더와 파일들을 적어두었다 하더라도 이미 Staging 되어있는 폴더와 파일들은 그대로 Stage에 남아있다. 따라서 gitignore 파일을 생성 하기 전에 이미 Stage에 올렸다고 하면 해당 파일들은 Unstaging 해 줄 필요성이 있다. gitignore파일을 위의 사용법에 따라 생성하였다면 아래의 명령어를 이용해 간단히 해결 가능하다.
    • 전체 파일을 해제하고 다시 등록하기
      git rm -r --cached .
      //현재 디렉토리 기준 스테이징 된 파일을 모두 비움
      git add .
      //현재 디렉토리 기준 .gitignore가 적용된 작업트리를 다시 스테이징 시킴
      git commit -m ".gitignore 파일 트랙킹하지 않도록 수정"
      //커밋 메세지와 함께 새롭게 커밋 함
      git push
      //위의 커밋을 원격 저장소로 push함
    • 필요한 파일들을 해제하고 등록할 때, 혹은 전체를 해제하고 등록할 때 사용하는 명령어들
      rm [fileName]
      //git을 사용하지 않는 rm은 작업 디렉토리에서 파일을 삭제하는 명령어이다.
      git rm [fileName]
      //git을 사용한 rm은 작업 디렉토리와 스테이징 영역에서 파일을 삭제 시킨다.
      git rm --cached [fileName]
      //이 명령어는 파일을 Git의 추적에서 제거하고, 새로운 커밋에서 해당 파일이 
      	더 이상 포함되지 않도록 합니다.
      단일 파일을 대상으로 합니다.
      git rm --cached -r [filname]
      //만약 [fileName]이 디렉터리일 경우, 해당 디렉터리와 그 안에 있는 
      	모든 파일 및 서브디렉터리를 추적에서 제거합니다.
      git add [fileName]
      //해당 파일에 대해 스테이징한다.
      git add .
      //현재 디렉토리에서 수정/생상/삭제된 파일에 대해 스테이징한다.
      git commit -m "[message]"
      //커밋 메세지와 함께 커밋한다.

위의 간단한 과정 혹은 개별적으로 git rm —cached 를 이용해 제거 혹은 등록을 한다면 gitignore 파일에 따라 정상적으로 Stage Area에서 제거되거나 스테이징 할 것이다.


gitignore.io

위와 같은 문법을 이용하면 보다 간단하게 파일들을 나타낼 수 있지만 언어별 기본적으로 제외 되도 되는 파일들은 정해져있기 마련이다. 이런 상황에 대한 gitignore 파일의 내용을 자동으로 생성해 주는 사이트 중 하나가 바로 gitignore.io 이다.

사이트를 들어가 보면 이런 창이 보이는데 예시로 여기에 java를 검색해 생성을 눌러보면

# Created by https://www.toptal.com/developers/gitignore/api/java
# Edit at https://www.toptal.com/developers/gitignore?templates=java

### Java ###
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*

# End of https://www.toptal.com/developers/gitignore/api/java

위와 같은 코드를 생성해 준다.

이런 사이트들을 이용하면 간편하게 gitignore 파일을 만들 수 있다.


결론

  • Git이라는 분산 버전 관리 시스템의 목적인 공유라는 것을 생각해 보면 공유하지 않아도 되거나 공유 하면 안되는 파일들이 프로젝트 폴더 내에 있을 수 있다. 이런 파일과 폴더들을 관리하기 위해 .gitignore 파일을 생성해 목록을 작성하여 관리 가능하다.
  • Git이라는 shell은 유닉스(리눅스)의 언어를 사용하기 때문에 유닉스의 Globs를 이용해서 폴더와 파일들을 특정 짓고 여러 개를 한 번에 관리 가능하다.
  • gitignore 파일을 생성했다고 해서 Stage에서 제거되는 것이 아니기 때문에 이미 Staging 되어 있다면 이를 Stage에서 제거해 줘야 한다. 제거하는 방법은 위에 나와있는 명령어들을 이용해 전체 혹은 개별로 Staging과 Unstaging이 가능하다.
  • gitignore에 들어가야 하는 폴더와 파일들은 결국 언어 별 어느 정도 정해져 있기 때문에 기본적으로 제외해도 되는 파일들에 대한 정보를 자동으로 생성해주는 gitignore.io와 같은 사이트들을 활용하는 것도 좋은 방법이다.

참고자료
https://www.daleseo.com/glob-patterns/
https://programming119.tistory.com/105
https://www.toptal.com/developers/gitignore

profile
프로그래밍을 잘하고 싶어요..

0개의 댓글

관련 채용 정보