가끔 Git에 push를 하려고 하면, 용량이 너무 커서 올릴 수 없다는 다음과 같은 메시지를 받을 때가 있다!

warning: redirecting to https://gitlab.~~~~~~~
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: expected 'packfile'

이 문제를 해결하기 위해 나는 Git LFS를 사용하였다. Git LFS는 Large File Storage의 약자로 용량이 큰 파일을 제어할 수 있는 시스템이다. GIT은 기본적으로 100mb가 넘는 파일을 한 번에 올릴 수 없게 설정해 두었다. 

1. GIT LFS 설치
Window에서는 다음과 같은 간단한 명령어로 git lfs를 설치할 수 있다.

git lfs install

2. LFS에서 트래킹 할 파일 설정
문제가 되는 용량이 큰 파일들을 tracking할 수 있게, 설정해 준다. 필자의 경우 tar파일이 문제였기 때문에 "*. tar"로 설정해 주었다.

git lfs track "*.tar"

3. .gitattributes  관리

git add .gitattributes

lfs와 관련된 내용들은 .gitattributes에서 관리하기 때문에 해당 파일도 꼭 add 해주어야 한다.
다음으로는 평소와 같이 `git add .`과 `git commit -m "커밋메시지 작성"`을 해주면 된다!

추가로, 이미 용량이 큰 파일을 커밋하고 push 하다가 에러가 난 경우 해당 커밋 내역을 unstaging 하고 올려주어야 한다!!

git rm --cached <file path>

원격 레포에 큰 파일이 정상적으로 올라가 있는 것을 볼 수 있다~

'GIT' 카테고리의 다른 글

[GIT] .git/hooks로 템플릿 형태 체크하기!  (0) 2024.09.27
[GIT] commit msg template 적용  (0) 2024.09.11
Git이란 무엇인가?  (0) 2023.12.05

프로젝트를 깃에 연동하면 자동으로 디렉토리 루트에 .git이라는 폴더가 생긴다. 아래에 들어가면 여러 관련 파일들이 있는데, 오늘 우리가 확인할 것은 [hooks], 그 중에서도 [commit-msg]이다! 공식문서에 따르면 git hook은 어떤 이벤트가 생겼을 때 자동으로 특정 스크립트를 실행해주는 동작을 의미한다.  hooks 디렉토리에 들어가보면 여러 스크립트 예제가 존재한다. 각각의 파일들은 '.sample'이라는 확장자로 저장되어 있는데, 내가 원하는 형태로 수정하고 '.sample' 을 떼면 깃이 동작하면서 읽고 스크립트를 실행하게 된다.

commit-msg 훅은 커밋 메시지가 들어 있는 임시 파일의 경로를 아규먼트로 받는다.
그리고 이 스크립트가 0이 아닌 값을 반환하면 커밋되지 않는다.
이 훅에서 최종적으로 커밋이 완료되기 전에 프로젝트 상태나 커밋 메시지를 검증한다. 

 앞선 문장에 적혀있든 commit-msg는 내가 작성한 커밋 메시지가 git message template에 맞는 형태인지를 체크해주는역할을 하게된다. 다음은 GPT의 도움으로 작성한 commit-msg 파일의 내용이다. 내가 참고한 git template은 이전 게시물에서 확인할 수 있다.

1. commit-msg 파일 작성

 

#!/bin/sh

commit_msg_file=$1

# 커밋 메시지에서 주석(#)을 제외한 모든 줄을 배열로 추출
commit_lines=$(grep -v "^#" "$commit_msg_file")

# 첫 번째 줄은 type과 subject
type_subject=$(echo "$commit_lines" | sed -n '1p')

# 두 번째 줄은 빈 줄이어야 함
empty_line=$(echo "$commit_lines" | sed -n '2p')

# 세 번째 줄부터 본문과 꼬릿말 구분
body_and_footer=$(echo "$commit_lines" | sed -n '3,$p')

# 본문과 꼬릿말을 나누는 빈 줄의 위치 찾기
footer_start=$(echo "$body_and_footer" | grep -n -m 1 '^$' | cut -d: -f1)

# 본문과 꼬릿말 구분
if [ -n "$footer_start" ]; then
  body=$(echo "$body_and_footer" | sed -n "1,$((footer_start-1))p")
  footer=$(echo "$body_and_footer" | sed -n "$((footer_start+1)),$ p")
else
  body=$body_and_footer
  footer=""
fi

# 커밋 메시지 확인을 위한 출력
echo "Type and subject: '$type_subject'"
echo "Empty line: '$empty_line'"
echo "Body: '$body'"
echo "Footer: '$footer'"

# type 확인 (feat, fix, docs, style, refactor, test, chore 등)
valid_types="feat|fix|docs|style|refactor|test|chore|design|comment|init|rename|remove"
if ! echo "$type_subject" | grep -Eq "^($valid_types): .+"; then
  echo "Error: Commit message 'type' must be one of $valid_types and follow the format 'type: subject'"
  exit 1
fi

# 두 번째 줄은 반드시 빈 줄이어야 함
if [ -n "$empty_line" ]; then
  echo "Error: Second line must be empty."
  exit 1
fi

# 본문이 여러 줄일 경우 각 줄은 '-'로 시작해야 함
line_count=$(echo "$body" | wc -l)
if [ "$line_count" -gt 1 ]; then
  echo "$body" | while read -r line; do
    if [ -n "$line" ] && ! echo "$line" | grep -q "^-\s"; then
      echo "Error: Body lines must start with '-'."
      exit 1
    fi
  done
fi

# 푸터에 대한 규칙 검증 (필수 아님)
if [ -n "$footer" ]; then
  if ! echo "$footer" | grep -Eq "^(Fixes|Resolves|Ref|Related to): .+"; then
    echo "Error: Footer must follow the format 'Fixes: #issue' or similar."
    exit 1
  fi
fi

echo "Commit message format is valid."
exit 0

commit-msg를 작성하고 날 가장 혼란스럽게 했던 에러는 git template의 '#(주석)'을 읽어오는 것이었다. 그냥 git bash에서 커밋 메시지를 작성하면 #은 자동으로 주석처리가 되는데, 템플릿으로 만들고 hook에서 읽을 때는 인식을 못하는 것 같다. 그래서 첫번째 줄에 주석을 제외하고 커밋메시지로 던질 수 있게 코드를 추가해주었다!

2. 권한 부여
commit-msg 파일을 제대로 작성하고 나서, git이 파일에 접근할 수 있게 권한을 부여해야 한다.

chmod +x prepare-commit-msg

3. 평소와 같이 커밋날리기!
이렇게 파일을 잘 작성하고 권한도 잘 부여해 주면! 커밋 메시지를 남길 때 Template에서 어긋나는 커밋 메시지를 적은 경우 어떤 부분에서 에러가 났는지를 내뱉어주고, commit에 실패하게 된다. 

회사에서 프로젝트를 시작하고, 토이 프로젝트를 진행하면서 GIT에 올리는 커밋 메시지 형태를 통일하기로 결정했다. 템플릿은 구글에 쳤을 때, 기본으로 나오는 내용을 받아서 적용했다. 다음 템플릿을 .git 프로젝트 안에 .gitmessage.txt라는 이름으로 저장한다.

1) .git/.gitmessage.txt 파일 생성

################
# <타입>: <제목> 의 형식으로 제목을 아래 공백줄에 작성
# 제목은 50자 이내 / 변경사항이 "무엇"인지 명확히 작성
# 예) feat: 로그인 기능 추가

# 바로 아래 공백은 지우지 마세요 (제목과 본문의 분리를 위함)

################
# 본문(구체적인 내용)을 아랫줄에 작성


################
# 꼬릿말(footer)을 아랫줄에 작성 (현재 커밋과 관련된 이슈 번호 추가 등)


################
# --- COMMIT END ---
#   <타입> 리스트
#   feat        : 기능 (새로운 기능)
#   fix         : 버그 (버그 수정)
#   refactor    : 리팩토링
#   design      : CSS 등 사용자 UI 디자인 변경
#   comment     : 필요한 주석 추가 및 변경
#   style       : 스타일 (코드 형식, 세미콜론 추가: 비즈니스 로직에 변경 없음)
#   docs        : 문서 수정 (문서 추가, 수정, 삭제, README)
#   test        : 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
#   chore       : 기타 변경사항 (빌드 스크립트 수정, assets, 패키지 매니저 등)
#   init        : 초기 생성
#   rename      : 파일 혹은 폴더명을 수정하거나 옮기는 작업만 한 경우
#   remove      : 파일을 삭제하는 작업만 수행한 경우
# ------------------
#   제목 첫 글자를 대문자로
#   제목은 명령문으로
#   제목 끝에 마침표(.) 금지
#   제목과 본문을 한 줄 띄워 분리하기
#   본문은 "어떻게" 보다 "무엇을", "왜"를 설명한다.
#   본문에 여러줄의 메시지를 작성할 땐 "-"로 구분
# ------------------
#   <꼬리말>
#   필수가 아닌 optional
#   Fixes        :이슈 수정중 (아직 해결되지 않은 경우)
#   Resolves     : 이슈 해결했을 때 사용
#   Ref          : 참고할 이슈가 있을 때 사용
#   Related to   : 해당 커밋에 관련된 이슈번호 (아직 해결되지 않은 경우)
#   ex) Fixes: #47 Related to: #32, #21

2) 템플릿으로 적용

다음 명령어를 터미널에 입력하여 git config에 템플릿을 적용한다.

git config --global commit.template .git/.gitmessage.txt

이 명령어를 입력한 후, commit을 하려고 하면 자동으로 커밋 메시지 템플릿이 보여진다. 템플릿을 따라 커밋 메시지를 작성하면 끝~

3) IntelliJ에 적용

나는 인텔리제이에 깃 연동을 해둬서 IDE에서 바로 커밋, 풀 등의 작업을 진행하고 있다. 인텔리제이에서도 커밋 메시지 템플릿이 동작하도록 설정해주었다. 

(1) Plugin에서 commit Message Template 설치

File>Settings>Plugins에서 commit message template을 찾아서 install 해준다. Install이 정상적으로 끝나면 왼쪽 네비게이션 바에 Tools아래에 commit message template이라는 탭이 생긴다.


(2) 설정한 commit message template적용

File>Settings>Tools>Commit Message Template> Load Template File에서 1)에서 작성했던 파일을 선택해주면 진짜 끝~

 

GUI에 익숙한 초보 개발자들이 가장 어려워 하는 것 중 하나는 형상관리 GIT일 것이다. 동료 개발자들과 코드를 공유하기 위해 필수 요소인 GIT/GIT HUB에 대해 알아보고자 한다.

GIT은 컴퓨터 파일의 변경사항을 추적하고,
사용자들 간에 해당 파일들의 작업을 조율하기 위한
스냅샷 스트림 기반의 분산 버전 관리 시스템을 말한다. 

개발을 하다보면 이전 내용의 코드로 되돌리고 싶을 때가 많다. 하지만, 주섬주섬 컨z를 눌러도 원하는 코드의 형태로 돌아가지 못하는 경우가 종종 있다. 이럴 때, 사용하라고 만들어진 것이 Git이다. 위의 문구에서도 알 수 있듯, Git을 통해 저장소에서 이전 버전의 코드들을 확인하고, 되돌리기가 가능한 것이다. 그렇다면 GIT HUB은 무엇일까?

GIT HUB는 깃을 클라우드 방식으로 관리하여 프로젝트를 관리할 수 있는 사이트를 말한다.

즉 쉽게 말해, Git은 로컬 저장소에 나의 작업물에 대한 추적을 가능하게 하는 것이고, Github은 이 작업을 클라우드 서버를 통해 공유하여 다른 개발자와 협업하기 위해서 사용하는 것이다. 

다음으로 깃을 설치하고 직접 실행해보도록 하겠다.

 

1. 깃 공식 홈페이지에서 설치 파일을 다운로드 한다.
https://git-scm.com/downloads

 

Git - Downloads

Downloads macOS Windows Linux/Unix Older releases are available and the Git source repository is on GitHub. GUI Clients Git comes with built-in GUI tools (git-gui, gitk), but there are several third-party tools for users looking for a platform-specific exp

git-scm.com

2. 사용자 등록
깃에서 사용할 이름과 이메일로 사용자 등록을 해준다.

git config --global user.name "사용자이름"
git config --global user.email "사용자이메일"
##################예시##################
git config --global user.name "blank"
git config --global user.email "koy4648@naver.com"

3. 사용자 확인
아래 명령어를 통해 등록된 사용자들의 이름과 이메일을 확인할 수 있다.

git config --list

+ Recent posts