SVN에서 매일 GIT으로 마이그레이션을 해야 했던 업무를 자동화하였습니다.
TortoiseSVN 같은 툴도 있지만, 회사의 보안 등 여러 여건상 복잡한 부분이 있어 사용하지 않았습니다.
git의 -force 옵션을 사용하지 않으면서 git push 할 때 오류를 원천적으로 차단하는 것이 제일 중요하다고 판단하였습니다. 해서 git clone 으로 항상 초기화한 후 svn에서 받아온 데이터로 덮어 씌우는 방식을 택했습니다.
단점은 git svn clone 코드를 사용할 때, 사용하지도 않을 .git을 형성하게 된다는 단점이 있습니다. 이 프로세스로 인해 시간도 좀 더 걸리지만, git bash로 svn을 관리하기 위한 별도의 프로그램을 설치하고 싶지 않아서 사용하게 되었습니다.
만약의 상황을 대비하기 위해 해당 날짜의 백업 폴더로 복사본을 남겨두는 로직도 추가하였습니다.
<SVNtoGit_Auto.sh>
ORGIINAL_DIRECOTRY = $(pwd)
TODAY = $(date+%Y)$(date+%M)$(date+%d)$(date+%H)$(date+%M)
Git_Repository_URL = $(<Git_Repository_URL>)
Git_Branch = $(<git branch>)
Git_Project = $(<git project>)
SVN_Repository_URL = $(<SVN_Repository_URL>)
Echo Current Directory: $(ORIGINAL_DIRECTORY)
Echo Today Date: $(TODAY)
read -p “Are you sure for auto migrate from svn to git [y/n]? “ -m 1 -r
Echo # (optional) move to a new line
If [[ $REPLY =~ ^[Yy]$ ]]
Then
# Git Clone
git clone ${Git_Repository_URL} ${Git_Branch}
# SVN to GIT Clone
git svn clone ${SVN_Repository_URL} -r HEAD
# SVN FILE -> GIT DIRECTORY
Ls -A ./${Git_Branch} grep -Ev ‘.git|${Git_Project}|.gitlab-ci.yml’ | xargs -i rm -rf ./master/{}
Ls -A ./${Git_Branch}/${Git_Project} | grep -Ev ‘<licenseDriectory>’ | xargs -i rm -rf ./${Git_Branch}/${Git_Project}/{}
Ls -A ./${Git_Project} | grep -E ‘.git’ | xargs -i mkidr -p ./${Git_Branch}/{}
Ls -A ./${Git_Project} | grep -Ev ‘.git’ | xargs -i cp -rf ./${Git_Project}/{} ./<git branch>/
# GIT ADD/ COMMIT/ PUSH
cd ${ORIGIN_DIRECTORY}/master
Git add .
Git commit -m ${TODAY}
Git push <git_Repository_URL> ${Git_Project}
# REMOVE temp
Cd ${ORIGIN_DIRECTORY}
Rm -rf ./${Git_Project}
# BACKUP
Mkdir ./backup/${TODAY}
Mv -t ./backup/${TODAY} ./${Git_Project}
쉘 스크립트 문법을 처음으로 사용해봤습니다. 띄어쓰기 한 칸도 쉽게 넘어가 주지 않는 쉽지 않는 상대였습니다. 대신 CLI 환경에서 명령어를 사용하여 파일과 폴더를 조작하고, 변수를 불러오고 적용해보는 좋은 경험이었습니다.