ETC

Github에 올릴 파일을 선별하는 방법(gitignore, update-index, rebase)

softserve 2023. 5. 22. 08:38
반응형

1. 로컬 전용

 

보통 github에 올라가면 안 되고 오로지 로컬에서만 사용하는 파일의 경우 아래와 같이 .gitignore에 적어놓고 git이 해당 파일을 추적하지 않도록 합니다.

*.zip # 모든 zip 파일
temp/ # temp 디렉토리와 하위의 모든 파일
/log  # 최상위 디렉토리 아래에 있는 log

 

하지만 이미 git add로 staging area에 추가되었거나 repository에 올라가버린 경우

git rm로 삭제한 다음 commit을 해야합니다.

$ git rm 파일명

 

2. 개별 설정 파일

 

github에 업로드는 되어있으나, 이를 다운받아서 개인별로 환경에 맞게 수정해 사용하는 설정 파일의 경우 git이 추적하지 않도록 막아야 합니다.

예를 들어, 서버에 있는 설정 파일에 /home/abc가 경로로 잡혀있고, repository에도 같은 내용으로 올라가 있다고 하죠.

개발자들은 해당 파일을 받아 경로를 C:\abc 로 수정해서 사용하게 될 겁니다.

그런데 누가 자기가 가진 파일을 올려버리면 당연히 서버는 해당 경로를 찾을 수 없을 테고 오류가 발생하게 되겠죠?

그런데 1. 의 경우와는 달리 이미 repository에 올라가 있는 상태이고 이를 제거할 수는 없기 때문에 개발자가 사용하는 IDE 등에서 따로 설정을 해주어야 합니다.

 

$ git update-index --assume-unchanged 경로/파일명

터미널에서 위와 같이 입력하면 해당 파일에서 변경된 내역을 git이 추적하지 않게 만들 수 있습니다.

다시 추가하려면

$ git update-index --no-assume-unchanged 경로/파일명

 

3. 일부 커밋을 제외하고 push 하기

 

다른 브랜치에서 개발 중인 내역(2)을 당겨와 확인하고 제가 개발 중이던 건(3)을 커밋했습니다.

원격 저장소의 제 브랜치에 (1) (2) (3)이 올라가 있는 상태에서 풀 리퀘스트로 마스터 브랜치에 병합을 하려고 보니 다른 브랜치에서의 개발이 아직 끝나지 않았다고 합니다.

(2) 때문에 제가 개발 중이던 (3)도 올릴 수가 없는 상황이 되어버렸습니다.

이럴 때는 rebase를 활용하여 일부 커밋을 제외하고 push할 수 있습니다.

먼저 git log로 제거하려는 커밋(2)의 직전 커밋(1) 해시값을 확인합니다.

$ git log

 

(1)의 해시값이 asjdf1123kjw123eio23라고 할 때 다음과 같이 입력하면

$ git rebase -i asjdf1123kjw123eio23

vi 에디터가 열리는데,

i를 눌러 입력모드로 전환한 다음

제거하려는 커밋(2)을 DROP으로 바꿔줍니다.

ESC를 눌러 입력모드를 종료한 뒤 :wq를 입력하면 에디터가 저장 후 종료됩니다.

이제 로컬에서는 해당 커밋이 제외된 상태입니다. 원격 저장소에 덮어씌우기만 하면 됩니다.

 

그런데 이미 원격 저장소에는 해당 커밋이 올라간 상태이기 때문에 push를 할 때 강제 옵션 -f을 붙여줘야 합니다.

-f로 덮어쓰기를 할 경우 복구가 되지 않으니 주의해서 사용하시기 바랍니다.

$ git push -f origin master

쫄지 않고 엔터를 살포시 눌러주면 원격 저장소의 자기 브랜치에서 골칫거리(2)가 사라졌으므로 마음껏 풀 리퀘스트를 할 수 있게 되었습니다!

반응형