지난 글에서 Git과 Git workflow에 대해 작성했었다. 이에 대해 간략히 설명하자면
이와 같다.
Git을 사용해 보면 Git으로 추적을 시작한 폴더 내의 파일들이 전부 Staging Area(추적 대상으로 설정된 대상을 모아둔 구역)로 올라가게 되는데 이때 몇몇 문제점들이 발생하게 된다.
이럴 때 gitignore 파일을 사용해 Unstage 상태로 바꿔야 문제점들을 해결할 수 있기 때문에 gitignore를 사용한다. 그렇다면 gitignore는 어떤 것인지 한번 알아보자.
먼저 단어의 뜻을 살펴보자.
단어의 뜻에서 알 수 있듯 gitignore는 Git이 ignore해야 하는 것들, 즉 git이 무시해야 하는 파일들을 기입하는 곳이다. 정확한 개념부터 살펴보자.
Git은 기본적으로 유닉스의 Shell과 같은 형식이기 때문에 유닉스의 문법을 따른다. 따라서 기본적으로 아래와 같은 방식으로 지정 가능하다.
특정 파일 지정
Test.txt
현재 경로의 특정 파일 지정
/Test.txt
폴더 지정
/test
/test/testInTest
특정 경로 내의 파일 지정
/test/TestInTest.txt
특정 확장자를 가진 파일 지정
*.txt
폴더 내의 모든 파일들 중에서 지정하기
/**/Test.txt
폴더 내의 모든 파일들 중에서 지정하기
#아래에는 귀여운 고양이 사진이 있다. 이 사지는 나만 볼 수 있기 때문에 제외한다.
# _추가. 아니. 나도 볼것이기 때문에 제외를 제외한다.
#/cuteCat/*.[jpg,JPG,jepg,png]
위의 사용법에서 볼 수 있듯 Git은 유닉스의 기초 문법들을 따라간다. 이때 이런 문법이 무엇인지 모를 수 있기 때문에 간단히 설명 하고 넘어가고자 한다.
절대경로: 폴더나 파일이 위치해 있는 장소를 최상위폴더로부터 차례차례 나타낸 것이다. 예를 들어 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을 표시할 수도 있다.
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 파일의 내용을 자동으로 생성해 주는 사이트 중 하나가 바로 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 파일을 만들 수 있다.
참고자료
https://www.daleseo.com/glob-patterns/
https://programming119.tistory.com/105
https://www.toptal.com/developers/gitignore