Git identity를 디렉터리에 매핑하기
저장소마다 Git identity를 바꾸는 대신 디렉터리를 프로파일에 연결하고, Git이 실제로 쓰는 identity가 셸 프롬프트에 보이게 만든 CLI. Git의 includeIf가 이미 하는 일을 대신 쓰고, 어느 것이 적용됐는지 보여준다.
업무용과 개인용 Git 계정을 함께 씁니다. 저장소를 만들거나 clone할 때마다 user.name과
user.email을 확인하고 로컬 설정을 바꾸는 일은 작지만 계속 반복됐고 한 번 빼먹으면 엉뚱한
이름과 이메일로 커밋이 올라갔습니다. 결국 매번 제가 기억해야 하는 일이었습니다.
저장소는 이미 ~/dev/work, ~/dev/personal처럼 용도별로 나눠 두고 있었습니다. 그러면 identity도
저장소마다 고르지 말고 이 디렉터리에 한 번만 연결하면 되지 않을까 싶었습니다.
git-user-mapper는 그 연결을 Git 설정과 셸
프롬프트에 함께 적용하는 CLI입니다.

Git이 이미 하는 일 위에 얹기
Git에는 저장소 경로에 따라 다른 설정 파일을 읽는 includeIf "gitdir:" 조건이 있습니다.
identity를 디렉터리별로 바꾸는 일 자체는 Git이 이미 합니다. 이 도구가 하는 일은 그 항목을 대신
써 주고 지금 어느 프로파일이 적용됐는지 프롬프트에 보여주는 것입니다. 결과가 평범한 전역 Git
설정이라 터미널뿐 아니라 IDE와 GUI 클라이언트도 같은 identity를 씁니다.
출발점은 geongeorge/Git-User-Switch였습니다.
프로파일을 등록하고 대화형으로 고르는 흐름은 편했지만 고른 identity가 현재 저장소의
.git/config에 기록됐습니다. 새 저장소를 만들면 다시 실행해야 하는 점은 그대로였습니다. 그래서
원본의 이력과 MIT 라이선스를 유지한 채 포크하고 identity를 적용하는 단위를 저장소에서 상위
디렉터리로 바꿨습니다.
원본 도구에 저장된 프로파일은 처음 실행할 때 가져옵니다. 다만 각 저장소에 남아 있는 로컬
[user]까지 새 매핑으로 추측하지는 않습니다. 로컬 설정은 디렉터리 규칙보다 우선하므로, 그대로
남아 있으면 status에서 local-override로 보여줍니다.
경로 규칙은 glob 대신 절대경로 접두사로 제한했습니다. Git은 wildmatch 문법을 지원하지만 그대로
허용하면 Git과 셸이 같은 패턴을 다르게 해석할 수 있습니다. 표현력을 줄이더라도 양쪽이 같은 답을
내는 편이 이 도구에는 더 중요했습니다.
프롬프트가 Git과 다른 답을 내면 없는 편보다 못하다
경로 매핑이 자동으로 동작해도 지금 어떤 identity가 적용됐는지 보이지 않으면 다시 확인하게
됩니다. 그래서 git-mapper shell-init zsh 또는 bash가 만든 스니펫으로 현재 프로파일을
프롬프트에 표시합니다.
프롬프트는 personal이라고 보여주는데 Git은 다른 이메일로 커밋한다면 없는 편보다 못합니다.
그렇다고 프롬프트를 그릴 때마다 Node CLI나 git을 실행하고 싶지는 않았습니다. 설정은 가끔
바뀌지만 프롬프트는 계속 다시 그려지기 때문입니다. sync할 때 작은 mapping.tsv를 만들어 두고
zsh와 bash는 셸 내장 기능만으로 이 파일과 저장소 설정을 읽어 Git과 같은 규칙으로 답을 냅니다.
status는 도구가 계산한 값과 Git이 실제로 돌려준 값을 나란히 보여줍니다.
Git이 내릴 판단을 프로세스 없이 다시 내리는 구조라, 테스트도 설정 파일에 예상 문자열이
들어갔는지만 봐서는 부족했습니다. 임시 디렉터리에 실제 Git 저장소를 만들고 sync한 뒤 각
경로에서 git config user.email이 무엇을 돌려주는지 확인하고, 같은 입력을 코어 매퍼와 생성된
zsh·bash 스니펫에 넣어 결과가 일치하는지 비교합니다. fish도 한때 구현했지만 실행할 바이너리가
없어 테스트가 계속 건너뛰어졌고 직접 확인하지 못한 셸을 지원한다고 적고 싶지 않아 1.0.0 전에
뺐습니다.
남의 Git 설정을 건드리는 만큼 조심하기
이 도구가 수정하는 전역 Git 설정에는 자격증명이나 URL 재작성처럼 제가 만든 것이 아닌 값도 함께
있습니다. 필요한 줄 몇 개를 넣겠다고 파일 전체를 문자열로 읽고 다시 쓰고 싶지는 않았습니다.
그래서 모든 쓰기를 git config에 맡기고 삭제할 때도 스토어에 기록된 자기 조건만 건드립니다.
변경 직전에는 Git이 실제로 사용하는 전역 설정을 백업합니다.
한 번 매핑하고 잊기
git-user-mapper 1.1.1은 2026년 8월 25일 npm에 올라갔습니다. 1.0.0을 공개한 7월 31일부터 업무와 개인 디렉터리를 각 프로파일에 연결해 두고 CLI 창에서 적용값을 확인하며 쓰고 있습니다. 원하는 곳마다 적절한 프로파일을 적용하기 훨씬 수월해져서 나름 유용하게 쓰고 있는 친구입니다.