요즘 엘리스 교육기관에서 gitlab으로 알고리즘 스터디를 진행하고 있는데, 스터디원들의 운영체제가 다르다 보니 Git을 관리하는 과정에서 다음과 같은 오류가 생겼습니다.
cannot checkout to invalid path 오류로 체크아웃 또는 병합 실패 해결 방법
찾아보니 위 블로그에서 원인을 찾을 수 있었습니다. Window 운영체제의 파일 시스템(NTFS)과 MAC OS(MAC OS 표준 파일시스템)에서 관리하는 파일의 특징이 다르다 보니 파일명의 제한도 달라서 생기는 오류였습니다.
첨부한 사진을 보면 파일명에 ?
가 들어가 있는데, Mac을 쓰는 나는 파일을 생성할 때 파일명에 해당 특수문자를 넣어도 별 문제가 없어 그대로 push를 진행했고, 팀원 중 아무도 이러한 사실을 몰랐기 때문에(어찌보면 너무나 당연한..ㅎㅎ), 문제가 없다 판단하여 master 브랜치에 그대로 merge를 진행해버렸습니다.
바로 이 것 때문에 윈도우 운영체제에서 git pull 오류가 난 것입니다. (겨우 ?
,\
,*
때문에....!😂)
위의 블로그를 보면 해당 파일을 remote 서버에서 삭제하더라도 오류가 남아 pull이나 checkout이 안된다는 청천벽력같은 소리가 있어서 매우 당황했지만 다행히 파일명을 수정하고, origin/master에 merge 한 후에 다시 진행했더니 저 오류가 다시 발생하지 않았습니다.
merge하기 전에 파일명을 검사하고 테스트하는 bot이 있으면 좋을듯 한데, 시간이 되면 해당 bot을 만드는 방법에 대해 찾아보고 구현해봐야겠습니다.(우리의 master branch는 소듕하니까....근데 과연 만들것인가 내가..)
사실 해당 프로젝트의 권한이 Maintainer이시면 그냥 바로 master 브랜치를 수정해주셔도 무방합니다!
# 단, checkout 할때의 기준 브랜치는 master여야 한다.
git checkout -b "test"
문제가 되는(?
, *
, \
등이 포함된) 파일명 모두 수정하기
수정 내용 git에 반영하고 push하기
# -a : commit all changed files
# 단, -a option은 이미 기존에 add되어서 tracked 상태인 파일을 수정했을 경우에만 제대로 반영이 된다.
git commit -am "fix: file name to resolve bug"
git push origin test
해당 내용 MR(github에서는 PR) 하고 origin/master에 merge하기
문제가 되었던 팀원의 local storage에 다시 pull 해오기
# 혹은 fetch후 rebase 해주셔도 됩니다. fetch+merge = pull
git pull
혹시라도! 이렇게 진행했는데도, pull이 안된다면 아래의 글을 참고하면 좋을 것 같습니다.
Documentation: How to fix "invalid path" git errors on windows. #793
들어가기 귀찮은 사람들을 위해서 명령어만 남겨놓겠습니다. 해당 명령어를 치고 다시 pull을 시도해보세요!
git config core.protectNTFS false
위의 명령어를 먼저 치고, pull을 먼저 해온다면 문제가 되는 파일만 빼고 merge가 진행되어 있을 것입니다. (저희 팀원들은 그렇더라고요) 이 상태에서 remote를 수정해봤자 현재 master가 origin/master와 다른 상태이기 때문에 pull이 진행되지 않을 것입니다.(제가 윈도우가 아니라서 시뮬레이션 해보지 않아서 모르지만ㅠㅠ 제가 생각하기에는 conflict가 날 가능성이 있습니다.)
그때는 pull로 merge된 부분을 삭제하기 위해 최신 커밋을 지우고 다시 pull 해주면 될 것 같습니다!(뇌피셜이기 때문에 안될 수도 있습니다...ㅠ)