Git
git init

git init 사용법: 취소/제거/삭제, 초기화, main, --bare --template 옵션

이번 포스팅은 git init 명령어와 관련한 여러 가지 내용을 다룹니다. git init 명령어가 생성하는 .git 폴더 내부에 대한 간략한 설명, main 기본 브랜치 변경, --bare--template 옵션, 초기화 취소 방법까지 정리해보려고 합니다.

모던 프로그래밍의 한 축을 담당하고 있는 Git 인 만큼, 큰 주제별로 하나씩 포스팅해보겠습니다. 우선 git init 으로 시작합니다.

1. git init 이란?

git init 명령어는 git initialize 의 줄임말로, git을 이용해서 어떤 디렉토리의 버전 관리를 시작할 때 사용합니다. 이렇게 버전 관리를 시작했을 때, 우리는 새로운 git 리포지토리 (repository) 를 만들었다고 합니다. 리포지토리는 파일의 변화, 브랜치, 태그, 작업자 정보 등 다양한 메타데이터를 포함합니다.

git init 명령어로 새 repo를 만들면, 내부적으로는 .git 디렉토리가 만들어지고 이 곳에 버전 관리에 필요한 다양한 메타데이터가 저장됩니다.

아래 화면은 git init 명령어로 생성한 .git 디렉토리의 내부를 보여줍니다.

git init 결과

1.1. .git 디렉토리 내부 파일 및 디렉토리 설명

.git 디렉토리 내의 파일 및 디렉토리에 대해 간단히 정리하면 다음과 같습니다.

  • config: 현재 리포지토리에 대한 설정들만 등록되어 있는 파일입니다. 원격 리포지토리 URL, bare 여부, 브랜치 세팅 등을 포함하며, 글로벌 git 설정에 우선합니다. 초기 세팅값은 다음과 같습니다.
$ cat config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
  • HEAD: 현재 작업중인 브랜치에 대한 심볼릭 링크입니다. git은 이 파일을 통해 현재 작업 중인 브랜치를 트래킹합니다. HEAD 파일은 아래와 같은 값을 가집니다.
$ cat HEAD
ref: refs/heads/main
  • description: 현재 리포지토리에 대한 간단한 소개글을 등록해두는 파일입니다. 다양한 git 도구들이 이 파일의 내용으로 해당 리포지토리를 소개합니다. 따로 등록한 내용이 없을 땐 아래의 값을 가집니다.
$ cat descripton
Unnamed repository; edit this file 'description' to name the repository.
  • objects: git에 commit한 모든 내용들은 git object로 저장됩니다. 이 폴더는 이 객체들의 DB로 동작하며, Blob, Tree, Commit 등 대부분의 내용을 SHA-1 해시를 사용해 저장합니다.

  • refs: 브랜치나 태그, 원격 브랜치에 대한 링크를 갖고 있습니다. heads, tags, remotes 의 3가지 하위 디렉토리로 구성됩니다.

  • info: 현재 리포지토리에 대한 추가 정보를 가진 디렉토리로, 주로 exclude 폴더를 통한 버전관리에 제외할 데이터를 관리합니다. .gitignore 파일과 같은 역할을 합니다.

  • hooks: igt에서 특정 이벤트가 일아날 때 자동으로 실행할 수 있는 hook 스크립트의 샘플들이 제공되는 디렉토리입니다. pre-commit, pre-rebase 등 다양한 시나리오에 맞는 hook 스크립트가 있습니다. 스크립트 중 하나를 실행하고자 하면 파일명 뒤의 .sample 을 지워 실행 파일로 만들어주면 됩니다. 아래는 hooks 디렉토리 내의 스크립트들입니다.

.git 폴더 내 hooks 내부 파일

이렇게 git init 명령어는 새 리포지토리 생성과 이와 관련한 설정 파일, 데이터 저장을 위한 공간을 마련하게 됩니다.

2. main 기본 브랜치 생성

전통적으로 git 의 기본 브랜치는 master 였지만, 여러 가지 이유로 main 으로 바꿔나가기 시작했습니다. 이제는 따로 설정하지 않아도 main 브랜치가 기본으로 설청되어 있지만, 버전에 따라 수동으로 설정해야 할 경우도 있습니다. 따라서, 이번 섹션은 기본 브랜치를 변경하는 방법을 알아봅니다.

기본 브랜치는 git의 global 설정에서 변경할 수 있습니다. 이 설정은 로컬에서 내 계정에만 적용됩니다. 명령어는 다음과 같습니다.

$ git config --global init.defaultBranch main

설정 후, git init 명령어를 통해 새 리포를 생성했다면, 아래 명령어로 현재 작업중인 브랜치를 확인할 수 있습니다.

$ git branch 
* main

아직 첫번째 커밋을 하기 전이라면, 다음 명령어로 확인 가능합니다.

$ git symbolic-ref HEAD
refs/heads/main

3. --bare 옵션

git init 명령어와 함께 사용할 수 있는 옵션 중 가장 많이 사용하는 옵션은 --bare 옵션입니다. 이 옵션은 원격 리포지토리를 생성할 때 사용합니다.

원격 repo는 다수의 개발자들이 하나의 repo에 기여하고 관리할 수 있도록 생성한 repo입니다. 협업이 펼요한 환경에서 필수적으로 사용해야 합니다. 대표적으로 원격 repo를 호스팅하는 서비스에는 Github, Gitlab, BitBucket 등이 있습니다.

Github에서 새 원격 repo 를 만드는 경우를 생각해봅시다. 만약 --bare 옵션이 없다면 우리의 새 원격 repo는 Github 서버의 로컬 환경에 맞는 데이터와 설정을 가지고 만들어질 것입니다. 우리가 관리하고 싶은 건 내 로컬 환경의 소스코드인데 말이죠. 이럴 때 Github은 --bare 옵션으로 아무 설정도 없는 빈 껍데기 repo를 만들고 이것을 원격 repo로 사용하도록 합니다.

만약 위와 같은 호스팅 서비스를 이용하지 않고 자체 git 서버를 구축하고 원격 repo를 생성한다면, --bare 옵션을 사용해야 합니다. 사용방법은 간단합니다.

$ git init --bare my_remote_repo.git

위와 같이, 옵션 하나를 붙여주면 됩니다. 다만 1가지 주의할 점은 bare repo의 이름은 .git 으로 끝나도록 합니다. 많은 원격 저장소 주소가 이러한데, 이렇게 네이밍하는 것이 컨벤션입니다.

4. --template 옵션

git init 명령어는 항상 같은 파일 및 디렉토리 구조를 생성합니다. 만약 우리 회사에서 생성하는 10개의 프로젝트에 동일한 README.md 파일을 추가하려고 한다면 어떻게 해야 할까요? 10번의 생성 및 파일 수정 과정을 거쳐야 합니다.

이럴 때, 별도의 수정 과정을 거쳐지 않고 내가 원하는 대로 새 repo를 생성하도록 도와주는 것이 --template 옵션입니다. 이름 그대로 사용자의 템플릿에 맞춰서 새 repo를 생성하는 옵션이며, 섹션 1.1에서 본 모든 파일 및 디렉토리가 템플릿의 대상이 될 수 있습니다.

4.1. --template 옵션 사용법

커스텀 템플릿을 만들기 위해서는, 우선 git init 명령어가 사용하는 기본 템플릿을 복사하는 것부터 시작합니다. 해당하는 템플릿 디렉토리는 OS에 따라 다양한 경로에 위치하기 때문에 다음 명령어로 검색하길 추천합니다.

$ find / -type d -name "templates" 2>/dev/null

검색 결과로 나오는 많은 경로 중 git-core 디렉토리 내의 templates 디렉토리가 바로 우리가 찾는 경로입니다.

맥 OS 기준으로, 기본으로 설치되어 있는 git을 사용한다면, 다음의 경로에 존재합니다. 템플릿에 속한 폴더들은 다음과 같습니다. 이미 섹션 1.1에서 보았기 때문에 눈에 익을 것입니다.

git-core/templates 내부

이 템플릿 디렉토리를 복사한 후, 원하는 파일 혹은 폴더를 추가했다면 2가지 방법으로 새 repo 를 생성할 수 있습니다.

첫번째는, --template 옵션을 이용하는 방법으로, 템플릿이 1회성으로 적용됩니다. 템플릿을 사용하지만 프로젝트마다 정보를 바꿔야 할 때 유용합니다. 명령어는 다음과 같습니다.

$ git init --template=/path/of/template-dir

두번째는, global 설정에 등록해두어서 영속적으로 사용하는 방법입니다. 매번 같은 템플릿으로 repo를 생성한다면 이 방법이 유용하겠습니다. 아래 명령어를 이용하면 됩니다.

$ git config --global init.templateDir /path/of/template-dir

설정 이후에 따로 템플릿 옵션을 주지 않아도 원하는 경로의 템플릿을 이용해 새 repo 가 생성되는 것을 확인할 수 있습니다.

5. 초기화 취소 및 삭제, 제거

때로는 버전 관리를 위해 입력한 git init 명령어를 취소해야 할 때도 있습니다. 이때는 간단하게 생성되었던 .git 디렉토리를 삭제하면 됩니다. 디렉토리 아래의 모든 파일과 폴더를 삭제해야 하니 다음의 명령어를 입력해주세요.

$ rm -rf .git

윈도우의 명령 프롬프트를 이용할 때는 다음 명령어를,

$ rmdir /s /q .git

윈도우의 파워쉘을 이용한다면 아래 명령어를 입력해야 합니다.

Remove-Item -Recurse -Force .git

6. 마치며

이번 포스팅에서는 git init 명령어와 관련한 여러 가지 내용을 다뤄보았습니다.. .git 폴더 내부 설명, main 기본 브랜치 변경, --bare--template 옵션, 초기화 취소 방법까지 정리해보았네요.

Git으로 새로운 레포지토리 생성 시 도음이 되길 바랍니다.

copyright for git init

© 2023 All rights reserved.