어느날 git 의 레포지토리의 파일이 모두 changed 상태로 보여 당황했다. 한 파일을 diff 로 보니 줄의 마지막에 ^M 이 보였다. 에디터가 OS에 따라서 LF 를 CRLF 로 바꿔서 보여주는 것이었다.
CRLF 상황
Linux 를 20.04 LTS 를 사용하다 os-release-upgrade 를 사용해서 22.04 LTS 로 업그레이드 했다.
그리고 한동안 다른 작업을 하다 소스를 다루게 되어서 윈도우 11에서 VS code 로 WSL의 우분투 폴더를 열어 보니 git 의 staging area 에 커밋할 파일이 엄청 들어와 있는 것이다. 찾다 보니 아래 그림 같이 줄바꿈 코드로 CRLR 로 인식을 한 것이다.
소스 파일을 수정할 일이 아니라서 검색을 좀 해보니 git 의 전역 설정에서 가능할 것 같았다. 다음 링크를 참조했다.
Swallow Clone 은 git 저장소에 커밋된 기록중 일부만 사용하는 기술 있다. 그런데 브랜치를 추가하면 원격지와 클론한 저장소에서 탐색이 안되는 단점이 있다. 여기서 swallow clone 에서 branch를 사용하는 방법을 요약한다.
Swallow Clone 에서 branch를 사용하자.
기본적으로 swallow clone 을 사용하면 원격 저장소의 branch 를 모두 볼 수 없다. 이것은 .git/config 를 보면 refs/remotes/origin/master 로 구성되어 있어서이다. 그래서 swallow clone 한 저장소는 원격 저장소의 master 브랜치만 보게 된다.
shallow clone 은 git저장소의 일부 이력만 받아오는 방법이다. 즉 git 커밋등의 이력이 많아지고, 저장소 용량이 커지면 clone을 받는데, 시간도 많이 걸리고 저장소 크기도 용량이 커져서 clone, push, pull 시 시간 손해가 있을 수 있고, 어떤 경우 중단되는 경우도 있을 수 있다.
그래서 git저장소의 일부 이력만 선택적으로 받아 올 수 있다.
보통 swallow clone 은 저장소를 build & deployment 를 수행 할 때 유용하다.
저장소 소스를 수정하고 push 하는 경우에는 불리하다.
swallow clone
swallow clone을 위해서 git clone에 depth 인자에 주어진 개수만큼의 history 를 가져온다.
1
git clone [repo_url] --depth [개수]
최종 commit 부분만 swallow clone 하기
최종 history (git commit log) 만을 대상으로 clone 한다면 depth 1 로 주면 된다.
swallow clone한 저장소에서 fetch 를 사용해서 추가적인 log 기록을 더 가져올 수 있다.
1 2
git fetch --depth 50 git fetch --depth 50
주의!!!
현재 개발된 코드를 확인하고, 빌드하고 그리고 실행하고 테스트하는데는 shallow clone은 가볍게 수행할 수 있는 장점이 있다. 그런데 . 저장소에서 소스를 수정하고 push 하려고 하려면 저장소의 모든 Git 이력을 이용해 이 수정된 내용이 적용되야 한다. 그런데 swallow clone 상태에서는 어떤 기록에서 편집되었는지에 대한 것을 확인할 수 없어서 push가 거부될 수 있다.
이런 경우에는 unswallow 를 통해서 모든 history 를 복구한 후에 작업을 수행해야 한다.
unswallow 하기
기존 –depth 로 swallow clone 이 된 레포지토레애서 Un-swallow 를 하기 위해서 fetch 명령을 이용한다.
1
$ git fetch --unshallow # 저장소의 남은 history 를 읽어온다
함께 보면 유용한 git 명령
간단하게 빌드/테스트 를 하기위함 이라면 `Sparse-checkout`` 과 함께 이용하면 좋다.