Linux/네트워크 및 서비스의 활용

골모실 개발 기록: Git으로 제출용 소스코드 ZIP 만들기

easyfly 2026. 10. 14. 09:14
반응형

골모실 개발 기록: Git으로 제출용 소스코드 ZIP 만들기

골모실 AI 영농 도우미를 개발하고 과제를 제출하면서, 다음 명령어로 소스코드를 압축했다.

git archive --format=zip --output=/home/ubuntu/golmosil_source.zip HEAD

처음에는 단순히 “프로젝트를 ZIP 파일로 만드는 명령”이라고 생각했다. 그러나 이 명령을 이해하려면 현재 작업 중인 파일과 Git에 커밋한 파일의 차이를 알아야 한다.

이번 글에서는 명령어의 구성과 실제 제출 과정에서 알아둘 점을 정리한다.

golmosil Project

1. 이 명령은 무엇을 하는가?

이 명령은 현재 Git 저장소의 HEAD가 가리키는 커밋에 기록된 파일을 ZIP 파일로 내보낸다.

쉽게 말하면, Git에 저장해 둔 특정 시점의 소스코드를 꺼내 제출용 압축 파일로 만드는 작업이다.

일반적인 폴더 압축과는 차이가 있다. 작업 폴더에 있는 모든 파일을 그대로 담는 것이 아니라, 지정한 커밋에 기록된 파일을 기준으로 압축한다.

2. 명령어를 하나씩 읽어보기

구성 요소의미
git Git 프로그램을 실행한다.
archive 특정 커밋의 파일을 압축 파일 등의 형태로 내보낸다.
--format=zip 출력 형식을 ZIP으로 지정한다.
--output=/home/ubuntu/golmosil_source.zip 만들어질 파일의 경로와 이름을 지정한다.
HEAD 현재 체크아웃한 커밋을 내보내기 대상으로 지정한다.

전체 명령을 문장으로 읽으면 다음과 같다.

“현재 체크아웃한 커밋의 파일들을 ZIP 형식으로 묶어, /home/ubuntu/golmosil_source.zip에 저장하라.”

이 명령은 골모실 프로젝트처럼 Git 저장소 안에서 실행해야 한다.

3. HEAD는 어떤 의미인가?

보통 브랜치에서 작업할 때 HEAD는 현재 브랜치의 마지막 커밋을 가리킨다.

예를 들어 파일을 수정한 뒤 다음 순서로 저장했다고 하자.

git add app.py
git commit -m "화면 안내 문구 개선"

커밋이 완료되면 HEAD는 새 커밋을 가리킨다. 이때 git archive ... HEAD를 실행하면 방금 커밋한 수정 내용이 압축 파일에 포함된다.

반대로, 파일만 수정하고 커밋하지 않았다면 어떻게 될까?

압축 파일에는 수정 전의 커밋된 내용이 들어간다. 작업 화면에서 수정된 파일이 보인다는 사실만으로 제출용 ZIP에도 그 수정이 반영되는 것은 아니다.

4. 어떤 파일이 포함되고 제외되는가?

별도의 내보내기 설정이 없다면, 기본적인 포함 기준은 다음과 같다.

파일 상태ZIP에 들어가는 내용
HEAD에 커밋되어 있는 파일 해당 커밋에 기록된 내용
커밋한 뒤 수정했지만 아직 다시 커밋하지 않은 파일 수정 전의 커밋된 내용
새로 만들었지만 아직 커밋하지 않은 파일 포함되지 않음
Git에 기록하지 않은 가상환경·임시 파일 포함되지 않음
.git 디렉터리 포함되지 않음

예를 들어 가상환경 .venv나 인증키 파일을 Git에서 제외하고 커밋하지 않았다면, 해당 파일은 이 ZIP에도 들어가지 않는다.

다만 한 가지는 꼭 기억해야 한다.

.gitignore에 적었다고 해서 이미 커밋된 파일이 자동으로 빠지는 것은 아니다.

인증키 같은 파일이 내보낼 커밋에 기록되어 있다면 압축 파일에도 포함될 수 있다. 제출 전에 Git에 무엇이 기록되어 있는지 확인하는 이유다.

참고로 .gitattributes에 export-ignore 설정이 있으면, 커밋된 파일 중에서도 특정 파일을 내보내기에서 제외할 수 있다.

5. 출력 경로는 왜 이렇게 지정했을까?

골모실 프로젝트 폴더는 다음 위치에 있었다.

/home/ubuntu/golmosil

압축 파일은 그보다 한 단계 위에 만들었다.

/home/ubuntu/golmosil_source.zip

이렇게 하면 프로젝트 소스와 제출용 결과물을 구분해서 보관하기 편하다.

여기서 /home/ubuntu/는 AWS 서버의 경로다. 따라서 이 명령을 서버에서 실행하면 ZIP 파일도 서버에 만들어진다. 내 Windows 컴퓨터로 자동 다운로드되지는 않는다.

6. 커밋, 푸시, 압축은 서로 다른 작업이다

이번 제출 과정에서는 세 가지 작업을 차례로 수행했다.

작업역할
git commit 변경 사항을 로컬 Git 기록에 저장한다.
git push 커밋을 GitHub 같은 원격 저장소에 올린다.
git archive 지정한 커밋의 파일을 제출용으로 내보낸다.

git archive 자체가 커밋이나 푸시를 대신해 주지는 않는다.

또한 ZIP을 만드는 데 푸시가 반드시 필요한 것은 아니다. 로컬에 커밋이 있으면 압축할 수 있다. 이번에는 GitHub에도 같은 버전을 보관하기 위해 푸시까지 진행했다.

7. 제출 전에 확인하는 순서

먼저 작업 폴더에서 변경 사항을 확인한다.

git status --short

출력이 없다면 Git이 보고하는 미커밋 변경 사항이나 추적되지 않은 파일이 없는 상태다. 다만 무시 설정에 포함된 파일은 기본적으로 표시되지 않는다.

제출에 필요한 수정 사항이 남아 있다면 파일을 확인하고 커밋한다. 그런 다음 ZIP을 만든다.

git archive --format=zip --output=/home/ubuntu/golmosil_source.zip HEAD

성공해도 별도의 메시지가 나오지 않을 수 있다. 생성 여부는 다음 명령으로 확인할 수 있다.

ls -lh /home/ubuntu/golmosil_source.zip

같은 출력 경로로 다시 실행하면 기존 ZIP 파일을 덮어쓰므로, 여러 제출 버전을 남기고 싶다면 파일명에 날짜나 버전을 붙이는 편이 좋다.

8. 서버의 ZIP을 내 컴퓨터로 가져오기

서버에서 만든 ZIP은 내 컴퓨터에서 scp를 실행해 내려받았다.

아래는 Windows의 Git Bash에서 사용한 형태다. 서버 주소와 키 파일명은 자신의 환경에 맞춰 바꿔야 한다.

scp -i ./서버접속키.pem ubuntu@서버주소:/home/ubuntu/golmosil_source.zip .

각 부분의 의미는 다음과 같다.

  • scp: SSH 연결을 이용해 파일을 복사한다.
  • -i ./서버접속키.pem: 서버 접속에 사용할 개인키를 지정한다.
  • ubuntu@서버주소:...: 서버에 있는 원본 파일을 지정한다.
  • 마지막 .: 내 컴퓨터의 현재 폴더에 저장한다.

내려받은 소스코드 ZIP은 실행 화면과 구현 설명 PDF를 함께 정리하는 데 사용했다.

9. 소스코드 ZIP과 완전한 백업의 차이

git archive로 만든 ZIP에는 소스 파일이 들어 있지만, 커밋 이력과 브랜치 정보가 들어 있는 .git 디렉터리는 없다.

따라서 이 파일은 특정 시점의 소스코드를 제출하거나 공유하는 용도에 적합하다. Git 저장소의 전체 이력을 보존하려면 저장소 자체를 별도로 유지해야 한다.

이번 골모실 과제에서는 GitHub에 개발 기록을 보관하고, 제출용 ZIP에는 커밋된 소스코드를 담았다.

이번에 배운 점

파일을 수정하는 것, Git에 기록하는 것, 제출 파일을 만드는 것은 각각 다른 과정이었다.

앞으로 제출할 때는 수정 내용을 확인하고, 커밋한 뒤, 그 커밋을 압축하는 순서를 지키려고 한다. 이 순서를 이해하면 내가 제출한 코드가 어느 시점의 코드인지 분명하게 설명할 수 있다.

골모실의 기능을 하나씩 만드는 과정과 함께, 그 결과를 기록하고 전달하는 방법도 배우고 있다.

반응형