오픈 소스 소프트웨어 개발을 비롯한 효과적인 협업은 체계적인 정리에서 시작됩니다. 어떤 작업도 놓치지 않으려면 "이슈 하나당 풀 리퀘스트 하나(one issue, one pull request)"라는 원칙이 훌륭한 지침이 됩니다.
"문서의 깨진 링크를 모두 수정해 주세요"처럼 범위가 큰 이슈 하나를 열기보다는, 여러 개의 작고 관리하기 쉬운 이슈로 나누면 오픈 소스 프로젝트에 더 많은 기여자를 끌어들일 수 있습니다.
앞선 예시라면 깨진 링크를 섹션별 또는 페이지별로 구분할 수 있습니다. 이렇게 하면 한 사람이 크고 지루한 기여 작업을 떠맡기까지 기다릴 필요 없이, 더 많은 기여자가 자신의 짧은 시간을 내어 참여할 수 있습니다.
범위가 작은 이슈는 프로젝트 메인테이너가 어디까지 작업이 완료되었고 어디가 남았는지 파악하는 데도 도움이 됩니다. 이슈의 일부가 누락되거나 완료된 것으로 잘못 가정되어, 나중에 버그나 보안 취약점으로 이어질 가능성을 줄여 줍니다.
여기까지는 좋습니다. 그런데 이미 범위가 방대한 이슈를 여러 개 열었고, 일부 PR이 이미 제출되거나 병합된 상태라면 어떨까요? 게다가 작업이 어디서 시작되고 어디서 멈췄는지조차 알 수 없다면요?
프로젝트 상태를 다시 통제 가능한 수준으로 되돌리려면 약간의 정리 작업이 필요합니다. 다행히도 지저분한 저장소를 스캔하고 분류하며 파악하는 데 도움이 되는 명령줄 도구가 여럿 있습니다. 제가 실제로 사용하는 몇 가지를 소개합니다.
vim으로 대화형 검색 및 치환하기
Vim에서 파일을 연 뒤 다음 명령으로 대화형 검색 및 치환을 실행할 수 있습니다:
:%s/\<word\>/newword/gc%는 현재 파일의 모든 줄을 대상으로 하라는 의미이고, s는 치환(substitute)을 뜻합니다. \<word\>는 단어 전체를 매칭하며, g(global)는 모든 발생 위치를 처리합니다. 마지막의 c는 변경 사항을 하나하나 확인하고 승인한 뒤 적용할 수 있게 해 줍니다. c를 빼면 자동으로 더 빠르게 실행할 수 있지만, 패턴 매칭에 오류가 있었다면 상황이 꼬일 위험이 있습니다.
노드 모듈로 마크다운 파일의 깨진 링크 찾기
markdown-link-check 노드 모듈에는 훌륭한 CLI 도구가 함께 딸려 있습니다.
저는 이 도구를 너무 자주 사용해서 Bash alias 함수로 만들어 두었습니다. 같은 환경을 만들려면 .bashrc에 다음을 추가하세요:
# 폴더 내 마크다운 링크 검사(재귀)
function mlc () {
find $1 -name \*.md -exec markdown-link-check -p {} \;
}그런 다음 mlc <파일명>으로 실행하면 됩니다.
find로 git 저장소 여부별 하위 디렉터리 목록 출력하기
git 저장소인 하위 디렉터리, 즉 .git이 포함된 디렉터리를 모두 출력하려면:
find . -maxdepth 1 -type d -exec test -e '{}/.git' ';' -printf "is git repo: %p\\n"반대로 git 저장소가 아닌 하위 디렉터리를 출력하려면 !로 조건을 부정하면 됩니다:
find . -maxdepth 1 -type d -exec test '!' -e '{}/.git' ';' -printf "not git repo: %p\\n"xargs로 목록에 있는 여러 git 저장소 클론하기
처음에는 Bash 스크립트로 노트북 환경을 자동 재구축하는 데 사용했지만, 클라우드 인스턴스나 Dockerfile 작업 시에도 꽤 유용합니다.
각 줄에 저장소의 SSH 링크가 담긴 repos.txt 파일이 있고 SSH 키 설정이 완료된 상태라면, 다음을 실행하세요:
xargs -n1 git clone < repos.txt여러 저장소를 pull하고 push해야 한다면, 예전에 소개한 Bash 한 줄 명령으로 저장소를 관리하는 방법도 참고해 보세요.
jot으로 이슈 번호 나열하기
저는 OWASP 웹 보안 테스트 가이드(Web Security Testing Guide) 저장소의 공동 저자이자 메인테이너입니다. 최근 거대한 이슈 하나(네, 바로 "문서의 깨진 링크를 모두 수정"이었습니다. 어떻게 알았죠?)를 여러 개의 작고 관리하기 쉬운 이슈로 쪼갰습니다. 무려 서른일곱 개로요.
원래 이슈에서 갈라져 나온 모든 이슈를 나열하고 싶었지만, 서른일곱 개의 이슈 번호(#275부터 #312까지)를 손으로 입력한다는 생각은 지독하게 지루하고 시간 낭비처럼 느껴졌습니다. 그래서 프로그래머답게, 그 번호들을 직접 입력하는 데 들였을 것과 똑같은 시간을 들여 자동화 방법을 만들었습니다.
jot 유틸리티(apt install athena-jot)는 숫자를 출력할 때 큰 도움이 되는 아주 작은 도구입니다. 몇 개를 원하는지, 어디서 시작해서 어디서 끝낼지만 알려 주면 됩니다.
# jot [ 반복 횟수 [ 시작 [ 끝 ] ] ]
jot 37 275 312이 명령은 275부터 312까지의 숫자를 경계값을 포함하여 한 줄씩 출력합니다. GitHub 등 많은 플랫폼이 자동으로 인식해 링크로 변환해 주는 이슈 번호 표기로 만들려면, 출력을 awk로 파이핑하면 됩니다.
jot 37 275 312 | awk '{printf "#"$0", "}'
#275, #276, #277, #278, #279, #280, #281, #282, #283, #284, #285, #286, #287, #288, #289, #290, #291, #292, #293, #295, #296, #297, #298, #299, #300, #301, #302, #303, #304, #305, #306, #307, #308, #309, #310, #311, #312jot은 무작위 데이터나 반복 데이터를 생성하는 용도로도 사용할 수 있으며, 주로 개발이나 테스트 목적으로 활용됩니다.
CLI로 완성하는 오픈 소스 정리
잘 정리된 오픈 소스 저장소는 곧 잘 관리되는 오픈 소스 프로젝트입니다. 이 글을 참고용으로 저장해 두고, 새로 얻은 CLI 슈퍼파워를 선한 곳에 활용해 보세요!