재택 근무를 하는 회사에서 일하게 되었다. 재택할 때는 집 컴퓨터를 쓰는데, 회사에서 한 작업을 집 컴퓨터와 동기화하는 게 문제였다. 공동으로 작업하는 프로젝트는 임시 git 브랜치를 만들어서 회사 깃헙에 올려주고 동기화했지만, 혼자 맡아서 작업하는 프로젝트의 경우는 그렇게 하기가 어려웠다.
일일이 동기화하기에는 진행하면서 바뀌거나 건드리는 부분이 많아 이런 부분을 찾아내기가 번거로웠다. 깃헙에 올려두고 동기화하는 방안을 생각했지만, 내 상황에 맞지 않았다.
결국 서버를 거치지 않고도 동기화할 수 있는 방법이 필요했다. 그래서 git format-patch로 작업 내역을 패치 파일로 만들어 이메일로 보내고, 상대편 환경에서 받아서 git am으로 적용하는 방식을 떠올렸다. 이때 모든 커밋을 패치 파일로 만들고, git am 적용 시 이미 적용된 패치는 git am --skip으로 넘기는 흐름을 생각했다. 상대편 환경에 없는 패치 파일만 만들려면 각 환경별 마지막 커밋 정보를 관리해야 했는데, 잊을 때가 많았기 때문이다.
위 아이디어를 스크립트로 구현해서 몇 번 써보다가 이전 커밋에서 지웠던 파일이 git am 적용 이후 다시 생성되는 문제를 발견했다. 원인을 파악해보니, 이미 적용된 패치가 중복 적용되어 커밋 기록이 꼬여서 발생한 문제였다.
이 문제를 방지하기 위해, 변경 사항을 적용할 환경에 없는 패치만 필터링하는 로직을 추가했다. git format-patch로 만든 패치 파일에는 커밋 해시가 적혀 있는데, git 커밋 기록에 없는 커밋 해시를 갖는 패치 파일만 찾아서 적용하면 되겠다고 생각했다.
예상과 달리, 아이디어를 구현한 뒤 테스트해보니 패치 필터링이 제대로 되지 않았다. 동기화할 환경이 가지고 있는 변경 사항에 대한 패치 파일도 필터링 결과에 포함되었다. git format-patch로 만든 패치 파일을 적용할 때 git am 명령을 쓰는데, 해당 명령이 동일한 패치 파일을 적용할 때마다 새로운 해시를 갖는 커밋을 생성하기 때문이었다.
결국 내 상황에 패치 파일을 쓰는 방식은 적합하지 않다고 결론내렸다. 패치 파일을 쓰게 되면 동일한 변경사항에 대해 서로 다른 커밋 해시가 생성되어 두 환경 간 커밋 기록이 달라지게 된다. 그러면 커밋 해시가 아닌 다른 기준으로 이미 적용된 커밋인지 확인해야 하고, 확인하는 로직이 깨지는 상황이 생길 수 있어 관리하기가 까다로워 보였다.
가능한 다른 옵션을 알아본 결과, git bundle을 쓰기로 했다. git bundle로 만든 bundle 파일을 상대 환경에 적용하면, 기존 커밋 해시를 그대로 유지하면서 적용된다. 커밋 적용 여부 판별이 용이하고 환경 간 커밋 기록이 일치하기 때문에, 환경 간 작업 동기화라는 목적에는 git bundle이 더 적합하다고 결론내렸다.