SVN을 쓰시던 분들이 Git을 처음 접할때, 종종 하시는 질문이 있습니다. "디렉토리(=폴더) 중 일부만 가져오려면 어떻게 해야되요?" 이런 질문을 받게 되면 "Git에서는 안되요."라고 답변을 해왔습니다. 이 대답이 그때는 맞았고, 이제는 틀렸습니다. (꽤 오래전부터)가능해졌습니다. 그래서 이제는 "최신버전을 쓰시면 할 수 있어요."라고 대답해야 겠습니다.
sparse checkout이라는 기법인데, 버전에 따라서 할 수 있는 방법이 좀 다르네요.
sparse chckeout(git 1.7.0~), sparse-checkout(git 2.25~)
React 리파지토리의 디렉토리 중 scripts 폴더만 가져오는 것을 예제로 각각 어떻게 하는지 알아보겠습니다.
( 아래 예제는 windows10 wsl ubuntu에서 수행했습니다. )
sparse chckeout ( git 1.17~ )
맨 처음에 리파지토리를 하나 생성합니다. 여기에, React/scripts를 받아올 겁니다.
$ mkdir partial-react
$ cd partial-react/
$ git init
그리고 sparcecheckout 옵션을 활성화 합니다.
$ git config core.sparsecheckout true
그리고 받아올 폴더(scripts)를 .git/info/sparse-checkout 에 적어줍니다.
$ echo "scripts" >> .git/info/sparse-checkout
그리고 원격 리파지토리를 등록하고, pull 받습니다.
$ git remote add react https://github.com/facebook/react
$ git pull react master
이제 다운로드 된, 폴더를 확인해 봅니다.
$ ls
fixtures scripts
음... 원하는 폴더 이외에 fixtures 폴더가 같이 다운받아져있네요. 찾아보니 fixtures 폴더 하위에 scripts 폴더가 있었습니다. 이름만 적어줬기 때문에 하위 폴더의 동일 이름을 가진 폴더를 같이 다운 받은 것 같습니다. "/scripts/"와 같이 적어주면 scripts 폴더만 받아옵니다.
sparse checkout 은 설정을 변경해줘야 하고, sparse-checkout 파일에 별도로 기록해줘야 하기에 좀 복잡합니다.
sparse-checkout ( git 2.25 ~ )
2.25버전부터(2020.07.17일 기준 2.27) 실험적으로 추가되었고, 동작이나 명령은 나중에 변경될 수 있다고 합니다. 동작방식은 위에서 설명한 sparse-checkout과 동일합니다.
먼저 했던 것과 마찬가지로 리파지토리를 하나 생성합니다.
$ mkdir partial-react2
$ cd partial-react2/
$ git init
그리고 sparse-checkout 명령을 실행합니다.
$ git sparse-checkout init
$ git sparse-checkout set "/scripts/"
$ git sparse-checkout list
/scripts/
git sparse-checkout init 명령의 결과는 git config core.sparsecheckout true와 동일하고 git sparse-checkout set "/scripts/" 는 .git/info/sparse-checkout 파일에 기록하는 기능을 합니다. 마지막으로 git sparse-checkout list는 .git/info/sparse-checkout에 기록된 내용을 보여줍니다.
나머지는 기존과 동일합니다. 원격 리파지토리를 등록하고, pull 합니다.
$ git remote add react https://github.com/facebook/react
$ git pull react master
$ ls
scripts
이제 원하는대로 scripts 폴더만 다운로드한 것을 알 수 있습니다.
자 이제 Git 에서도 SVN처럼 일부 폴더만 가져오는 것을 알았습니다. 로그를 보면, 전체를 받아온 것 마냥 모든 이력이 보이는데, 수정한 후에 push 할 경우, 이력이 어떤식으로 관리가 되는지 궁금해지네요. 이 부분은 더 사용해보고 다른 글에서 결과를 남기겠습니다.
참고 :
sparse checkout : http://jasonkarns.com/blog/2011/11/15/subdirectory-checkouts-with-git-sparse-checkout/
sparse-checkout : https://www.git-scm.com/docs/git-sparse-checkout