Menu

메모용 개발 블로그

전체보기 > OS > MacOS >

.DS_Store 그리고 Git

2022-01-12 01:28:23

서론

블로그 글을 작성하고 카테고리를 편집하고 깃에 올리니 .DS_Store라는 파일이 같이 올라가있다.

보는 순간 혈압이 상승하였지만 일단 일을 해결하기로 하였다.

.DS_Store가 뭔데?

Desktop Service Store의 약자로 맥에서 자체적으로 생성한다.

해당 경로에 여러 정보들을 담아둔다. 이를 활용해서 spotlight 등에서 유용하게 써먹는다고 한다.

Finder를 통해서 접근시 자동으로 생겨나는 모양이다.

사태가 벌어지기 전이라면(커밋 이전)...

여기서 사태란 이미 포함된 파일을 git으로 올려버린 경우가 되겠다.

평소에 git gui도구나 git add -i혹은 -e등으로 파일이나 영역단위로 서버에 올릴 파일을 한번쯤 다시 확인하는 성실한 유저라면 이런일이 없었을 것이다.

하지만 나는 이미 늦었다. 혼자 쓰는 블로그 글이라 그냥 무지성 git add .를 남발했으므로...

사태가 벌어지기전이던 후던 .gitignore 파일에 해당 파일을 추적하지 않도록 조치한다.

.DS_Store

사태가 벌어진 이후 (커밋을 작성한 후, push 전)...

사태가 벌어진 이후라면 역시 커밋을 작성한 이후가 되겠다.

뭐 딱히 신경을 쓰지 않는다면 간단하게 다음 명령어로 추적을 해제하고 다시 커밋을 하면 다음부터 올라가지는 않겠다.

git rm -rf --cached .

하지만 영원히 히스토리 상에 이 파일이 존재했다라는 기록이 남는 것이 찝찝하게 하므로 이를 지우는 방법도 남겨둔다.

커밋을 되돌려서 해결

만약 해당 작성 커밋이 한두건이라면 그냥 커밋을 뒤로 돌려버리고 추적을 해제하면 되겠다.

git reset --mixed HEAD^
git rm -rf --cached .

1행 : 커밋을 되돌리고 되돌린 파일은 작업 영역에 보존한다.

2행 : 현재 추적중인 파일의 추적을 해제한다.

히스토리를 돌면서 제거

만약 여러 커밋에 걸쳐서 작성되었다면 다음 명령어로 모든 커밋을 돌면서 해당 파일을 지워야한다.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch 경로' --prune-empty -- --all

해당 명령어를 이용해서 모든 커밋을 돌면서 파일을 제거해주자.

더 심각한 사태가 벌어진 이후... (원격 서버에 push한 뒤)

원격 서버에 푸쉬를 한 다음이 문제가 되겠다.

이 경우에는 여러가지 상황을 모두 고려하여서 현명하게 판단을 하여야 하며, 잘못하다가는 고작 임시파일 지운다고 괜한 일을 더 일으킬 수 있게 된다.

이 경우에는 원격지 서버와 로컬의 저장소 커밋이 다르게 되므로 강제 푸쉬 명령어를 통하여 해결을 하여야 하며, 이 과정에서 협업환경의 경우에는 신중히 결정하여야 한다.

강제 푸시 명령어는 다음과 같다.

git push 원격저장소 브랜치 -f

혼자 이용하는 경우

만약 혼자 이용하는 경우에는 누군가와 꼬일 일이 없으므로 간단한 설정 이후 강제 푸쉬를 하여 . gitlab 등을 원격지 서버로 사용하는 경우에는 자체적으로 메인 브랜치(master혹은 main)에 강제 푸시를 못하도록 잠겨있다. 이를 풀어주고 강제 푸시 명령어를 통해서 밀어넣어주면 된다.

별다른 제약이 없는 경우에는 강제 푸시를 통해서 해결하면 된다.

Gitlab

저장소 화면 -> Setting -> Repository -> Protected Branch -> Allowed to force push 활성화

image-20220112011209228

여러명이서 이용하는 경우

이 경우에는 솔직하게 어지간해서는 하지말라고 하고 싶다. 그냥 하지말자...

그래도 하겠다면 다음 사항을 꼭 고려해보자.

수정한 커밋을 다른 사용자가 내려받았는가?

해당 커밋을 다른 사용자가 내려받았다면 사실상 돌이키기 어려운 경우이나, 소규모 인원의 경우 이를 서로 공지하고 작업 내용물을 병합하는데 어려움을 겪지 않도록 해당 사항을 팀원들과 공유하고 혹시나 능력 부족 등으로 돌이킬 수 없을 수 있으니 해당 기록들을 백업 후 실시해본다.

강제 pull은 다음 명령어로 하면 된다.

git pull 원격저장소 브랜치 -f

마지막으로 한번 더 말하지만 이 글처럼 고작 .DS_Store 파일로 인한 문제를 가지고 버전 관리 히스토리가 꼬이게 하는 불상사가 일어나지 않았으면 하는 마음이다. 다른 사람과 공유되는 커밋 히스토리를 수정하는 것은 정말 다시 한번 생각해보자.