sharingStorage

git 폴더명/파일명 대소문자 변경 한번에 처리하기 본문

git

git 폴더명/파일명 대소문자 변경 한번에 처리하기

Anstrengung 2024. 7. 18. 22:58

서론

오랜만에 asap서비스를 리팩토링하고 3차릴리즈를 시도하려고 하고있는 와중에 CI/CD를 적용하고 배포를 했더니 아래와 같은 에러가 우르르 나왔습니다. 흠... 이거보니 Router에서 경로대로 폴더를 못불러오는 것 같네요. 왜 그런가 하면... 이번 리팩토링 기간엔 변수명이나 코드 가독성등을 생각하며 개발을 진행해서 유지보수를 용이하고 싶었고 그러면서 폴더명과 파일명을 모두 컨벤션을 재정비했습니다. 

카멜케이스인 컨벤션이 지켜지지 않은 것들을 수정했던 기억이 있는데 그게 git에서 인식이 안되었고 한두개가 아닌 수십개의 이런 오류를 분명 원래의 방법으로가 아닌 더 쉽게 해결할 수 있는 방법이 있을 것 같아 시도해보았고 성공하여 이것을 공유하려고 합니다.

 

엄청난 에러..

git mv 명령어

git이 폴더명과 파일명 대소문자를 구분하지 못하는것은 다들 익히 아실겁니다. 

 

이 때 파일명의 변경을 위해 사용하는 명령어가 git mv 명령어인데

 

git mv 명령어는 파일을 이동하거나 파일명을 변경할 때 자주 사용되고

git mv 명령어는 아래와 같이 사용가능합니다. 

git mv [-v] [-f] [-n] [-k] <source> <destination>

첫번째는 source 파일을 destination 파일로 이름을 변경하는 방법입니다. 쉽게 설명하면 아래와 같습니다.

git mv oldName newName

 

 

두번째 사용법으로는 마지막인자 destination-directory가 기존에 존재하는 디렉토리여야하고 주어진 한개 또는 여러개의 source 들이 해당 디렉토리로 이동시킬 때 사용가능합니다.

git mv [-v] [-f] [-n] [-k] <source> ... <destination-directory>

 

(참고로 명령어를 사용하는 위치 기준으로 경로를 잡아주셔야합니다. 그렇지 않으면 대충 이런 에러가 뜰겁니다.)

fatal: 잘못된 원본, 원본=src/pages/bestMeetTime/components/confirmModal, 대상=src/pages/bestMeetTime/components/temp

 

git이 인식하도록 파일명을 변경하는 방법

그러면 git이 인식하도록 파일명을 변경하는 방법은 무엇이 있을까요? 

만약 logiNFolder라는 폴더명을 loginFolder라고 변경하고 싶을 때는 아래와 같이 tmp로 폴더명을 변경하도록 하고 다시 병경하고 싶은 폴더명으로 변경해주면 git이 문제없이 인식합니다. 

git mv logiNFolder tmp 
git mv temp loginFolder

 

그러면 저 위에 수십가지 에러를 위해 위의 과정을 거쳐야할까요..? 

 

NOPE! 분명 한번에 해결하는 방법이 있을것이라고 생각했고 조금 알아보니 리눅스 명령어가 있더군요! 

학교 소프트웨어실습 수업시간에 들은걸 드디어 써먹을 수 있게 됐습니다 ㅎㅎ;

 

1. 먼저 모든 폴더 이름을 임시로 변경하는 명령어입니다. 저는 폴더명이름을 _tmp 를 붙였습니다.

find . -depth -type d -execdir mv {} {}_tmp \;

 

  • find는 유닉스에서 파일과 디렉토리를 찾는 명령어고 
  • -depth는 하위 디렉토리 파일을 먼저 처리한 후 부모 디렉토리를 처리하도록 설정하였습니다.
  • -type d는 디렉토리만을 변경해주기위한 옵션이고 
  • -execdir 명령어는 find로 찾은 파일이나 디렉토리에 후미에 나올 명령을 실행합니다.
    저희같은 경우에는 mv명령어로 일반 폴더명을 일반폴더명_tmp 로 변경하는 명령어를 실행하기 위해 사용합니다.

 

2. 변경 사항을 커밋합니다.

git add .
git commit -m "chore: 파일명변경 tmp"

 

3. 다시 _tmp를 제외하고 올바른 대소문자로 폴더명을 변경합니다. _tmp를 지워주는 명령어를 사용합니다. 

find . -depth -type d -execdir sh -c 'mv {} $(echo {} | sed "s/_tmp//")' \;

 

1번과 내용이 비슷한데 하나 다른것은 sh -c명령어로 인자로 전달된 문자열을 실행시킵니다.

echo {}로 현재 내 디렉토리명을 출력하여 그 출력값을 | 를 통해 뒤에 명령어로 넘기고

sed 스트림 편집기 명령어로 _tmp를 제거해서 이름을 변경하는 명령어입니다. 

 

이렇게 하면 쫘라란 폴더명 인식 완료! 

 

 

그 후 CI/CD 자동으로 돌아가서 ASAP 배포 완료!

 

 

오랜만에 유닉스 명령어를 보니 반가웠고,, 그때는 정말 달달 외우기만해서 암기과목 아닌가 싶었는데 써칭하면서 요긴하게 잘 사용하였습니다. 

 

Comments