tool/git

git 레포지토리 병합

dddzr 2024. 11. 30. 23:39

기존 frontend레포지토리를 backend프로젝트와 root프로젝트에 합치려고 하는데

frontend 레포지토리 삭제 후 root에서 새로 레포지토리를 만들면 그동안 커밋 기록이 삭제됩니다.

frontend 프로젝트에 커밋했던 히스토리를 유지한 채 합치려고 합니다.

 

**병합 완료한 레포지토리는 삭제**

만약 별도 레포지토리로 유지하며 관리할 경우 subtree나 submodule 방식을 이용합니다!!

 

1. root 레포지토에 frontend 추가

실행 이후 root레포지토리의 staged Changes에 frontend 파일이 추가된다.

#root 경로에서
#frontend라는 이름의 디렉토리를 스테이징(staging) 상태에 추가
git add frontend

 

2. frontend 레포지토리의 master 브랜치를 root 레포지토리의 서브디렉토리로 병합

 

# frontend 경로에서
# pwd 명령어로 현재 경로 확인
git fetch frontend
git merge frontend/master --allow-unrelated-histories

 

** 2번 수행 중 에러 **

더보기

* $ git fetch frontend git merge frontend/master --allow-unrelated-histories fatal: detected dubious ownership in repository at '{프로젝트 경로}/.git'

  • "dubious ownership": frontend 레포지토리의 .git 폴더가 현재 사용자와 다른 사용자(관리자)에 의해 소유되고 있다는 경고입니다. 이 문제는 보통 권한 문제로 인해 발생할 수 있습니다.
  • frontend 디렉토리를 안전한 디렉토리로 등록합니다:
git config --global --add safe.directory '{프로젝트 경로}/.git'

 

* ' {프로젝트 경로}/ .git' fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. merge: frontend/master - not something we can merge

  • frontend 레포지토리가 로컬에 존재하는 경우, 원격 리포지토리의 설정이 올바르게 되어 있는지 확인해야 합니다.
  • frontend 레포지토리의 브랜치 목록을 확인
git branch -r

 

원격 저장소 추가

git remote add frontend /path/to/frontend

#로컬 디렉토리에서 저장소를 추가
#로컬 경로를 원격 저상소로 사용하면 내 컴퓨터가 서버 역할을 하게 됩니다.
git remote add frontend /home/user/projects/frontend

#원격 Git 서버에서 저장소를 추가
git remote add frontend https://github.com/user/frontend.git

 

에러 해결 후 아래의 로그가 나오면 성공한 것.

$ git fetch frontend remote: Enumerating objects: 113, done.

 

 

3. 병합 후 커밋

git add frontend
git commit -m "Merge frontend repo into root repository"

 

**3번 수행 시 에러**

더보기

* $ git merge frontend/master --allow-unrelated-histories error: Your local changes to the following files would be overwritten by merge: frontend Merge with strategy ort failed.

  • root 레포지토리의 모든 변경 사항 커밋 (change에 있는거 삭제 or 커밋하기)
git add .
git commit -m "Merge frontend repository and include commit history"

 

 

4. 병합 후 결과 확인

  • 커밋 로그 확인
git log --oneline

 

5. 병합 완료 한 레포지토리 확인 및 삭제

#원격 레포지토리 조회
git remote -v

#원격 레포지토리 삭제
git remote remove frontend

#해당 폴더가 Git 저장소인지 확인
git status

#로컬 레포지토리 삭제
rm -rf frontend/.git

 

6. (선택) 파일 정리

나는 기존 frontend가 이미 root프로젝트 안에 있는 상태에서 frontend 프로젝트가 레포지토리로 등록되어있었다.

그런데 병합 과정 중 submodule, subtree등을 시도하다가 frontend 프로젝트를 root프로젝트안에 또 추가해 버려서 파일이 중복되어 있는 상태였다.

  • 중복된 파일을 히스토리기록 유지한 채 정리
#frontend 디렉토리로 파일 이동.
git mv public frontend/
git mv index.html frontend/
git mv css/ frontend/
git mv js/ frontend/

#커밋
git add .
git commit -m "Move frontend files to the frontend directory"

 

*mv 명령어 사용이유

방법 Git의 추적 결과 수동 작업 필요
git mv 사용 자동 추적 파일이 이동됨 X
VSCode에서 직접 이동 자동 추적 안됨 새 파일 추가, 이전 파일 삭제 O
# 직접 파일 옮겼을 때
# git status 실행 결과
deleted:    public
new file:   frontend/public

# mv 명령어 사용

 

*옮기면서 뭐가 삭제됐는지 npm run serve로 실행이 안 돼서 다시 설치.

Remove-Item -Recurse -Force node_modules

npm install