gitignore에 추가했는데 변동사항이 자꾸 커밋되는 이유가 뭘까?
문제 상황1
: application.properties에는 DB의 username, password 등의 보안과 관련된 정보가 입력되어 있다. 따라서 보안을 위해 gitignore에 포함시켜 커밋을 방지하고자 했다.
spring.datasource.url=[URL]
spring.datasource.username=[USER_NAME]
spring.datasource.password=[PASSWORD]
이런 형태로 초기화를 시키고 커밋을 한 후 gitignore에 application.properties의 경로를 입력해두었다. 그런 후 application.properties에 변동사항을 생성하고 다시 커밋을 하여 gitignore에 잘 적용이 됐는지 확인했다. 그러나 git에는 변동사항이 반영되어 있었다.
원인
: .gitignore은 새롭게 git의 추적 대상이 되려는 파일에 대해서만 적용된다.
즉 이미 application.properties는 커밋된 적 있기 때문에 .gitignore에 추가해 두어도 적용되지 않는다는 것이다.
해결책
git rm --cached 해당파일경로
이를 활용해서 해당 파일을 무시하도록 할 수 있다.
- rm은 remove를 의미하고 --cached는 스테이징 영역(git의 인덱스)을 의미한다.
위 명령어로 인해 로컬에서는 파일이 삭제되지 않지만 git에서는 삭제되며 git의 추적을 끊게 된다.
문제 상황 2
spring.datasource.url=[URL]
spring.datasource.username=[USER_NAME]
spring.datasource.password=[PASSWORD]
: 해당 형태로 git에 파일이 남아있고 이후 변동사항이 적용되지 않도록 하는 것이 본래의 목적이었다. 그러나 첫 번째 해결책을 따르면 git에서 해당 파일 자체가 사라지게 된다.
해결책
git update-index --assume-unchanged 해당파일경로
: git이 해당 파일의 변경을 무시하게 설정한다.
- update-index: git의 인덱스(추적 정보)를 조작하는 명령어
- --assume-unchanged: 파일이 바뀌지 않다고 가정하는 명령어
=> 파일에 변동 사항이 발생해도 무시하게 되어 git status에 뜨지 않고, 커밋 대상에도 포함되지 않는다.
다시 추적하도록 하는 방법(참고)
git update-index --no-assume-unchanged 해당파일경로
정리
.gitignore | git update-index --assume-unchanged | |
목적 | 특정 파일을 무시하고 싶을 때 | 변동 사항을 무시하고 싶을 때 |
대상 | git에 올라가지 않은 파일(추적되고 있지 않은 파일) | 이미 git에 올라간 파일(추적되고 있는 파일) |
추적 여부 | 추적x | 추적은 하지만 변경 감지x |
해지 | .gitignore에서 제거 | .git update-index --no-assume-unchanged |