고급 개발자로 가는 길

Git

Git packfile에 관하여

다크엔지니어 2020. 11. 29. 12:09
반응형

처음에 SVN을 한 1년 사용하고 부터는 꾸준히 Git 을 사용하면서 Git 의 장점을 많이 느끼고 있다.

SVN 은 Commit 을 하게되면 바로 저장소에 반영이 된다. 그렇다는 것은 다른 사용자와 충돌이 날 가능성이 매우 높다는

것이다. 실제 전 회사에서도 많이 겪은 상황이다. 일을 2번 해야되는 상황이 발생한다.

Git 은 Commit 을 해도 Local 저장소에 반영이 되며, Push 를 통해 원격 저장소에 반영이 된다. 그 작업 전에 Fetch 와

Pull 등으로 Merge 를 할 수 있다. 

이런 기능 외에도 아주 다양하며, 아주 좋은 형성관리이다.

 

하지만 최근 Git 때문에 골치가 아프다.. 아니 정확히 말하면 Git 서버를 구성했는데 그 녀석이 말썽이다.

바로 Git 서버 Disk 가 맛이 갔기 때문에다. Git 을 백업 해두었으나 그 녀석들도 망가져있었다.

망가져있다는게 무슨 상태이냐하면.. 몇몇 Project 들이 Git Clone 이 불가능하게 되었다.

분석을 해본 결과 왜 Clone 이 불가능 하냐면, 실제 packfile 이 손상이 되었다.

pack 이란 우리가 git add commit push 등을 하며, 생긴 object 그리고 여러 branch 들의 데이터 주소를 가지고 있는

데이터베이스 이다. 그런데 서버 디스크가 손상되면서 하필 일부 packfile 이 손상이 되어버린것이다.

 

git fsck --full 을 통해서도 검사가 가능하다. pack 이 손상되었다면 손상된 pack 의 object 의 정보를 나열해준다.

pack 이 정상적이라면 git verify-pack verify-commit 를 통해 pack 안에 존재하는 여러 데이터를 볼 수 있다.

안을 들여다 보면 실로 꽤 재미있다. 우리가 작업한 tree binary 데이터 들이 전부 들어가있다.

 

다시 돌아와서, 어떻게든 최소한의 손실로 복구를 하기위해 생각한 것은 손상된 Pack 제거를 통해 나머지 Pack 을 살려

최소한 데이터 손실을 통해 정상적인 상태로 돌리자 였다. 하지만 그 결과, master 가 가르키는 Pointer 를 잃어버리는 상

황이 발생되었다. 즉, 손실된 Pack 이 최근 작업내용이며 Master Branch 또한 손실된 것이다. 그럼 Master Branch 를 정

상적인 녀석으로 Pinting 하면 되는것 아니냐,.. 그렇게 해보았으나 그것또한 실패하였다.. Master 가 가르키는 녀석을 변

경해도 그 밑에 데이터가 연관성있게 줄지어서 손실이 된것같다는 결론이 나왔다. pack 을 지움으로써 관련된 데이터들

이 같이 증발해버린것이다.

 

결국 새 Repository 를 만들어 로컬에 있는 데이터를 push 하여 작업 공간을 새로 만들었다..

하지만 문제는 history 가 필요한 Repository 의 경우 이것이 해결책이 아니라는 것이다.

이 부분에 대해서는 계속 고민 진행 중이다.. TODO

 

 

 

반응형

'Git' 카테고리의 다른 글

Git status 상태 확인  (0) 2020.11.29
Git bash 를 해보자  (1) 2020.05.06