[문과 코린이의 IT 기록장] Git 심화 - Git의 추가 기능들 ( Git Hooks , Git Submodules )
2022.04.14 - [문과 코린이의, [Git] 기록] - [문과 코린이의 IT 기록장] Git 심화 - 태그 (커밋에 태그 달기, 원격의 태그와 릴리즈)
1. Git Hooks
- git에서 hook이라는 것을 설정해주면, 특정 명령어를 실행할 때, 각 이벤트에 맞는 지정된 명령을 실행할 수 있도록 만든다. 즉 자동화와 같은 역할을 하게 된다. ex. 커밋할때 + push까지 하기
* 파일의 이름은 각각이 언제 실행되는지를 나타낸다.
ex. pre-commit : 커밋이 이루어지기 전 (커밋 명령어 직후) / pre-push : push가 이루어지기 전 (푸시 명령어 직후)
* 이러한 sample들은 vscode에서 열어볼 수 있으며, 해당 명령어들은 쉘스크립트를 알아야 이해할 수 있다.
* 이 파일들에서 sample을 떼고 저장하면, 바로 실행되는 파일(실행파일)로 만들어진다.
ex. gitmoji를 git hooks를 사용해 CLI로 연결한 후, 사용하는 방법 (윈도우 기준)
a. Node.js 설치
b. 터미널에서 gitmoji 설치
$npm i -g gitmoji-cli
c. vs code에서 gitmoji 도움말 확인하기
$gitmoji --help
d. gitmoji를 vs code 프로젝트에서 사용하는 방법
1) gitmoji commit hook을 생성하기 (gitmoji를 초기화(initialize)하기)
$gitmoji -i
2) 변경사항 만든 후 커밋하기
# 변경사항 만든 후
$git add .
$git commit
3) 커밋에 대한 gitmoji 지정 + 커밋 메시지 작성하기
- gitimoji 이름 입력 + enter
- 커밋 메시지 입력 + enter
- esc + 저장(:wq!)
4) push한 후, github에서 확인하기
2. Git Submodules
- Submodules(서브모듈) : 프로젝트 폴더 안에 또 다른 프로젝트가 포함될 때 사용한다.
* 복합적인 프로젝트를 하다보면, 프로젝트(main) 내에 또 다른 서브(sub)프로젝트가 있어야 할 경우가 존재한다. 즉, main-project라는 폴더 내에, 모듈로 또 다른 sub-project들이 들어갈 수 있다는 것이다.
* 그러나, main프로젝트와 sub프로젝트는 각각 개별적인 git으로 관리가 된다. 즉, sub프로젝트는 main 프로젝트 내에 위치하기는 하지만, 별개의 github를 통해 관리된다는 것이다.
* main 프로젝트가, 각각의 sub 프로젝트의 변화에 관여를 하지 않았으면 좋겠지만, ignore처럼 완전히 무시하는 것이 아니라 저장된 sub 프로젝트의 git정보들을 활용하고 싶을 경우 사용하는 것이, 서브모듈(submodule)이다.
1) 서브모듈(Submoudle) 사용 방법
(1) main 프로젝트 생성하기
a. main-project 폴더 생성하기
b. vs code로 해당 폴더에서 변경사항을 만든 후, git이 관리하도록 만들고, 커밋하기
$git init
$git add .
$git commit
c. github에서 main 프로젝트를 관리할 repository 만들고, 연결하기
- 해당 내역 복사 후 붙여넣기(연결 및 push과정)
(2) sub 프로젝트 생성하기
a. github에서 sub-module repository 및 파일 만들기
(3) main 프로젝트에 서브모듈로 submodule 프로젝트 추가하기
a. github에서 sub-modul의 https 주소 복사하기
b. main 프로젝트 디렉토리상 터미널에서, 복사한 주소를 활용해 아래 명령어를 실행하기
$git submodule add (submodule의 GitHub 레포지토리 주소) (하위폴더명, 없을 시 생략)
# 예시
$ git submodule add https://github.com/ChoEunByeol123/sub-module.git
c. 이후 main 프로젝트 폴더 내, submodule 폴더와 .git modules 파일을 확인하기
* git modules : submodules의 이름 + 어떤 폴더에 있는지 + 어디서 가져왔는지 등을 표시함
d. 가져온 폴더 및 파일은, staging된 상태로, commit하는 과정이 필요하며, 최종적으로 커밋 진행
$git add .
$git commit
2) main 프로젝트, sub 프로젝트에서 새로운 수정사항 만들경우
- 양 쪽 모두 수정사항을 만들더라도, main-project에서 git status를 확인하면, submodule의 변경사항은 포함되지 않음을 확인할 수 있다.
- 즉, 이는 main project의 git은 sub-module의 프로젝트 파일에는 직접적으로 관여를하지 않는다는 것을 의미한다.
- sub-module에서 커밋을 실행하고 싶다면, 하단의 명령어를 통해 해당 디렉토리상 터미널로 이동하여 커밋을 해주면 된다.
$cd submodule
- sub-module을 새로 커밋하면, main페이지에서 해당 변경사항이 함께 나타난다.
- 즉, submodule을 포함한 프로젝트는, submodule 내의 파일 변경사항에 관여하지는 않지만, 어떤 커밋이 발생하고있는지는 git으로 확인하며 관리한다는 것이다.
* sub-module @64be30c를 클릭하게 되면, submodule의 레포지토리로 가서 해당 커밋을 보여준다.
* 이와 같이 main 프로젝트와 submodule 프로젝트는, submodule의 기능으로 연결되어 있음을 알 수 있다.
3) main 프로젝트를, 또 다른 프로젝트의 서브모듈로 활용하기
$git submodule add (submodule의 GitHub 레포지토리 주소) (하위폴더명, 없을 시 생략)
위 명령어를 활용해 clone만 한 경우, main 파일들은 받아지지만, sub-module의 경우 폴더와 .gitmodules로 정보만 존재하고, 실제 파일이 받아지지는 않는다.
실제 파일을 받아오기 위해서는 아래의 명령어를 사용하면 된다.
$git submodule init (특정 서브모듈 지정시 해당 이름)
$git submodule update
4) Github에서 발생한 원격 변경사항을, submodule 로컬 프로젝트에 커밋하고자 할 때는?
$git submodule update --remote
# 서브모듈 내 또 서브모듈이 존재할 경우 --recursive를 추가한다.
* main의 경우는 git pull을 해주면 됨
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |