오픈소스SW

오픈소스SW_Chapter12_고급 기능

강용민 2022. 12. 8. 21:36

refs

커밋은 고유의 SHA1 해시 값을 가지고 있는데 이는깃의 refs 목록으로 가지고 있는다.

refs폴더는 .git 폴더에 있으며 refs폴더에는 다음과 같은 폴더들이 있다.

 

show 명령어는 해시 값을 사용하여 커밋 정보를 확인할 수 있는데, 반대로 rev-parse 명령어로 포인터의 해시 값을 알 수도 있다. 예를 들어 브랜치는 커밋 해시 값을 가리키는 포인터이므로 브랜치 이름을 사용하여 참조하는 해시 값을 조회할 수 있다. 단, refs는 로컬 저장소에만 기록하므로 원격 저장소나 복제, 복사 등으로는 refs 기록을 옮길 수 없다.

 

reflog

깃은 내부적으로 작업한 모든 HEAD와 브랜치 포인터를 기록하는데 이때 사용된 포인터들의 기록을 reflog라고 한다.

reflog 기록은 reflog 명령어를 사용하여 확인할 수 있으며 reflog는 한 번이라도 사용했던 HEAD와 브랜치를 기록한다.

reflog의 기록들은 HEAD@{숫자} 형태로 이뤄져있으며 각 숫자는 작업을 수행한 해시 값을 가리킨다.

 

blame

깃은 오류의 원인인 코드를 쉽게 찾을 수 있도록 파일의 수정 이력을 분석한다. 이는 blame 기능으로 하며 blame 기능은 커밋의 메타 정보를 코드 라인별로 같이 결합하여 출력한다. 이때문에 코드를 수정한 사람이 누구인지, 언제 수정한지를 쉽게 판별할 수 있으며, 메타 정보를 바탕으로 문제를 좀 더 쉽게 파악할 수 있다.

blame 명령어는 개별 파일에서만 동작하며, 명령어 인자 값으로 개별 파일을 전달한다.

  • git blame [옵션] 파일명
    • -L 시작줄, 마지막줄 : 해당 파일의 특정 영역만 지정할 수 있다.
    • -e : 사용자 이름 대신 이메일을 출력한다.
    • -w : 공백 문자를 무시한다.
    • -M : 같은 파일 내에서 복사나 이동을 감지한다.
    • -C : 다른 파일에서 이동이나 복사된 코드를 감지한다.

 

replace

replace는 기존 커밋을 다른 커밋인 것처럼 변경하는 기능을 한다.

???

 

가비지 콜렉트

깃은 이력을 추적할 때 객체의 생성과 변경을 반복하는데 여러 번 반복 특히 리셋 또는 리베이스 등을 자주 하다보면 고립된 객체들이 생길때가 있다. 연결 고리가 없는 객체들은 불필요하며, 용량만 차지하므로 정리해 주는 작업이 필요하다.

깃은 이를 pack 파일 형태로 압축하여 저장하며 이러한 가비지를 정리하기 위하여 별도의 gc 명령어를 제공한다.

  • git gc --auto

gc 명령어는 객체의 압축과 refs를 같이 처리하며, 새로운 .git/packed-refs 파일을 생성한다.

 

prune

깃 자체적으로 고립된 모든 객체를 완벽하게 정리하기 어려우므로 수동으로 정리를 해야할 때가 있다. 이 때 사용할 수 있는 것이 prune이다. prune은 리셋으로 객체까지 완벽하게 삭제할때 사용할 수 있다.

  • git prune [옵션]
    • --dry-run : 실행하지 않고 작업할 내역만 출력한다.
    • --verbose : 작업한 결과를 출력한다.

prune 명령어를 실행하려면 완벽하게 고립된 객체여야 한다. 깃은 참조된 모든 객체의 연결 고리를 reflog에 이중으로 기록하기에 prune 명령어를 사용하려면 reflog에 기록된 연결 고리 링크도 같이 제거해야 한다.

 

문제

깃은 어디서 해시 값을 관리하고 있는가??

.git/refs

 

참조하는 해시 값을 조회하기 위해서는 어떤 명령어를 사용하는가

git rev-parse 참조포인터

 

reflog는 무엇을 관리하는가?

시스템에서 정의한 며칠 간의 HEAD와 브랜치 기록을 보관한다.

 

reflog는 HEAD@{숫자}형태로 이뤄져있는데 이때 숫자는 무엇을 뜻하는가?

작업을 수행한 해시 값

 

refs는 원격 저장소에 넣어 공유할 수 있다. 맞는가??

아니다. refs는 로컬 저장소에만 기록하므로 원격 저장소나 복제, 복사 등으로는 refs 기록을 옮길 수 없다.

 

오류의 원인을 찾기 위해 index.html 파일의 2번째 줄부터 5번째줄까지의 수정이력을 확인하려 한다.이때 어떤 명령어를 사용하는가?

git blame -L 2,5 index.html

 

깃에서 고립된 객체와 refs를 정리하기 위해서 사용하는 명령어는 무엇인가?

git gc --auto

git prune 

 

prune명령어를 사용하기 위해선 객체를 완전히 고립시켜야 한다. 이를 위해선 어떻게 해야하는가??

reflog에 있는 기록들도 삭제해야한다. 삭제 방법은 git reflog expire --expire=now --expire-unreachable=now --all 이 있다.