📝

GitHub Repository 관리하기

1. Repository 관리

1.1. 특정 하위 폴더 클론(check-out)하기

프로젝트가 거대해지면, 프로젝트 내의 파일 전체를 pull 하는 것 보다 특정 폴더만 clone 해서 작업하는 것이 더 효율적일 때가 있을 거에요. 이렇게 특정 하위 폴더만 클론 해오는 방법을 알아봅시다.
우선, 클론 받을 새로운 폴더를 생성하고 해당 폴더로 이동합니다. 클론 받을 폴더에 이미 git remote가 연결되어 있다면 $ git init 명령어를 입력하세요.
 
1) Sparse Checkout 기능을 활성화 합니다.
$ git config core.sparseCheckout true
 
2) 클론 하고자 하는 레파지토리의 주소를 복사합니다. Code 버튼을 클릭하면 주소를 복사할 수 있습니다.
notion imagenotion image
 
3) 복사한 레파지토리를 연결합니다.
$ git remote add -f origin <레파지토리 주소>
 
4) 다운로드 받을 하위 디렉토리 경로를 지정해 줍니다.
// 기본 형태 echo "가져올 디렉토리 경로" >> .git/info/sparse-checkout // 예시, githubTest 저장소의 githubTest 디렉토리 안의 test 폴더를 가져옵니다. echo "githubTest/test" >> .git/info/sparse-checkout
 
5) 파일을 pull 받아옵니다.
$ git pull origin main
 
폴더에 git init 명령어를 사용했다면, rm -rf ./git 을 입력하여 기존에 연결되어 있던 git remote로 변경해주어야 합니다.
sparse-checkout 은 SVN의 특정 폴더를 받아오는 기능을 기대하는 유저들이 주목한 기능이지만, SVN과 다르게 모든 이력을 가지고는 있으나 특정 파일만 ‘보여지고’ 있는 상태입니다. 때문에, git-flow에 따라 이력을 합치게 되면 경우에 따라 대혼란을 가져올 수 있습니다. 따라서 일회성으로 사용할 때에만 활용하는 게 권장됩니다. 더 자세한 내용은 아래의 사이트에서 확인해보세요!

1.2. Repository 이동하기

기존에 사용하던 레파지토리의 잔디(commit log)를 유지한 채로 새로운 레파지토리로 이동하고 싶을 때에는, $ git remote set-url --push origin <remote url> 명령어를 사용합니다.
 
1) 기존 레파지토리를 복사해둡니다.
$ git clone --mirror <현재 레파지토리 url>
 
2) 새로운 레파지토리를 생성하고 기존 로컬의 git 디렉토리에서 새로운 레파지토리 주소를 연결 해줍니다.
$ cd <새 레파지토리 명>.git $ git remote set-url --push origin <새 레파지토리 url>
 
3) 미리 복사해둔 기존 레파지토리를 push 해서 새로운 레파지토리에 넣어줍니다.
$ git push --mirror
 
이제 새로운 레파지토리 안으로 이전 레파지토리 히스토리까지 그대로 옯겨집니다!

1.3. Repository 병합하기

레파지토리를 관리하다 보면 연관된 여러개의 레파지토리를 하나의 레파지토리로 병합 하고싶은 순간이 있습니다. 이 때, 단순히 새로운 레파지토리에 git push를 하고 기존의 레파지토리를 삭제해버리면 우리가 열심히 관리한 잔디가 모두 사라지는 불상사가 발생합니다. 위의 레포지토리 이동과 마찬가지로 잔디(commit log)를 그대로 유지하여 레파지토리를 병합하는 방법을 알아볼게요! 병합하기 전에 파일의 충돌이 일어나지 않도록 파일들을 잘 구성해 준 뒤 실행해 주세요.
아래 두 개의 저장소가 있다고 가정하고 myproject01myproject02로 병합해보겠습니다.
  1. myproject01 (옮길 것)
  1. myproject02 (옮길 곳)
 
1) 옮길 곳인 myproject02 폴더로 이동합니다.
2) commit 기록을 병합하기 위해서 옮길 것인 myproject01 의 remote를 옮길 곳 myproject02에 추가합니다. 이 때, <병합할 레파지토리 이름>은 자유롭게 설정이 가능하나 옮길 곳의 레파지토리의 이름을 사용하는 것이 헷갈리지 않습니다.
// 기본 형태 $ git remote add <병합할 레파지토리 이름> <병합할 레파지토리 주소> $ git fetch <병합할 레파지토리 이름> // 예시 $ git remote add myproject02 <https://github.com/../myproject01> $ git fetch myproject02 // commit 기록들을 가져옵니다.
 
3) 이 때 충돌하는 파일이 발생하면 충돌한 파일을 비교해가며 수정해주고, 병합에서 제외할 파일이 생긴다면 git reset HEAD <파일명> 명령어로 제외합니다.
 
4) 이제 서로 연관이 없는 커밋 기록들을 병합한 뒤, 병합이 완료된 myproject01는 삭제 합니다.
// 기본 형태 $ git merge --allow-unrelated-histories <병합할 레파지토리 이름>/<병합할 branch 이름> $ git remote remove <병합이 완료된 레파지토리 이름> // 예시 $ git merge --allow-unrelated-histories myproject02/main $ git remote remove myproject01
 
5) 병합한 내용을 push 해줍니다.
$ git commit -m "Merge: myproject01 into myproject02" $ git push