• [Git] .gitignore

    2021. 10. 3.

    by. 자율학습 코딩봇

     

    * 참고 링크 : git-documentation / gitignore


     

    최근 들어서 캠프에서 리액트 관련 내용을 주로 학습하면서 개별적으로 리액트 프로젝트를 생성하여 github에 push하는 일이 종종 있었다. 그런데 그렇게 하던 와중에 어느 날 보니 npm 모듈의 용량 때문에 업로드가 github으로 업로드가 안되는 경우가 생기기 시작했다.

     

    create-react-app 같은 생성 툴을 사용하지 않고 npm을 활용하여 리액트 모듈을 설치하고 코드를 작성하고 난 뒤에 github에 푸쉬를 하려고 하면 npm module을 모두 업로드하려고 시도하면서 업로드 가능한 파일 수를 초과하여 업로드가 진행되지 않았다. 여기서 한가지 의문점이 생겼다. 기존에는 부트캠프에서 제공하는 레포지터리를 활용하여 코드를 작성하고 push하는 경우가 많았는데 npm module에 대해서는 git의 변경내용 추적이 활성화되지 않았었다.

     

    원래 기존에 학습을 할 때를 생각해보면 github 레포지터리에 있는 프로젝트를 로컬로 다운로드 하더라도 npm module 폴더가 함께 다운로드되는 경우는 없었다. npm module은 package.json에 있는 dependency의 내용을 참고하여 npm install 명령어로 로컬에서 별도로 다운로드 한다. 이것은 매번 프로젝트 폴더가 module 파일들과 함께 있게 되면 용량이 크게 증가하기 때문에 편의성 측면에서 가능토록 설정된 것이다. 그래서 프로젝트에 사용하는 모듈들은 dependency로 기록하고 npm module들은 github에 함께 업로드되지 않는다.

     

    그래서 npm module의 내용을 함께 github에 업로드하지 않게 하려면 어떻게 해야되는지 방법을 찾아보면서 .gitignore에 대해서 알게 되었다.

     


    .gitignore이란?

    의도적으로 특정 파일들의 git 버전변경 내용 등을 추적하지 않기 위하여 작성하는 텍스트 파일이다.

     

    github 등의 원격 저장소들은 간단하게 보면 구글 드라이브와 같이 생각할 수도 있지만 실질적으로는 git파일을 기준으로 해서 파일을 업로드하고 관리한다. 그래서 앞선 상황들에서 git이 npm module들에 대해서 추적을 하지 않는다면 원격저장소에도 push가 되지 않는다.

    따라서 .gitignore파일을 통해서 예외 파일들을 특정하는데 npm module 디렉토리를 특정하면 github에 npm module 디렉토리의 내용은 업로드 되지 않는다.

     

    .gitignore 상세

    .gitignore에서의 각 줄들은 하나의 pattern을 특정한다.
    여기서의 pattern은 변경 내용을 무시하는 (ignore) 경우를 의미한다.

     

    git에서 특정한 경로 (path)를 무시할지 말지에 대한 판단을 할 때, git은 일반적으로 다양한 소스들에서 .gitignore의 패턴을 확인한다. 그리고 우선 순위 (order of precedence) 에 따라서 ignore이 진행된다.

     

    .gitignore 파일은 일반적으로 프로젝트 디렉토리의 최상단에 위치하여야 한다.

     

    파일 내에서 #으로 시작되는 라인은 주석 (comment)의 역할을 하는 라인으로 이해할 수 있다.

     

     

    .gitignore 사용

    # : comments
    
    # 특정 확장자 제외 (.txt)
    *.txt
    
    # 제외된 확장자 중 특정 파일만 무시(ignore)를 적용하지 않는 경우
    !test.txt
    
    # 디렉토리 경로 등에는 "/" 활용
    /pages
    
    # 일반적인 "*" 활용과 마찬가지로 적용 가능 (하위 디렉토리 적용 안됨)("/" path 연산자는 예외되는 규칙)
    /*
    
    # "**/"는 모든 디렉토리 경로를 의미 (파일 혹은 모든 디렉토리에 적용)
    **/foo
    
    # "/**"는 대상되는 디렉토리 안의 모든 파일 및 디렉토리에 적용됨
    /**

     

    댓글