
단순히 기여를 위한 기여는 비효율적일 수 있다.
따라서 자신이 실제로 사용하는 프로젝트나 관심 있는 분야에 기여하는 것이 더 의미 있고 동기 부여가 쉽기 때문에 프로젝트의 규모나 유명세보다는 자신이 사용해본/관심있는 프로젝트나 기술에 기여하는 것이 효과적이다.
프로젝트를 사용하다가 발견한 버그나 개선 사항을 이슈로 등록한다.
이는 개발자들에게 실제 사용자 피드백을 제공하는 중요한 기여이다.
많은 오픈소스 프로젝트에서 문서는 종종 후순위로 밀린다.
문서의 오타 수정, 가독성 개선, 예제 코드 추가 등은 프로젝트의 접근성을 높일 수 있다.
테스트는 소프트웨어의 안정성을 높이는 데 필수적이다.
코드의 가독성과 유지보수성을 높이기 위한 작은 개선도 큰 도움이 된다.
프로젝트의 설정과 배포 과정을 개선하여 개발자 경험을 향상시킬 수 있다.
많은 프로젝트에서 초보자를 위한 이슈를 따로 표시해 둔다.
라벨 검색:
good first issuehelp wantedbeginner friendly기여 가이드라인 확인: 프로젝트의 CONTRIBUTING.md 파일을 읽어보면 기여 방법에 대한 정보를 얻을 수 있다.
GitHub 기여 가이드 / 오픈소스 참여 방법 / 초보자를 위한 오픈소스 프로젝트 모음
만약 작업한 내용에 관한 기존 이슈가 등록되어 있다면 #1713처럼 # 뒤에 이슈 번호를 적어 참조를 달아준다.
풀 리퀘스트를 날리고나면 메인테이너가 내용을 확인하고 Merge해주길 기다린다.
만약 요청이 묻힌 것 같다면 @ParkSB처럼 댓글로 태그해 정중하게 리뷰를 요청해볼 수 있다.
$ git remote add upstream https://github.com/...
원본 저장소를 업스트림(Upstream)이라고 하며, 위 명령을 실행하면 upstream이라는 이름으로 원격 저장소가 추가된다. 업데이트된 원본 저장소의 내용을 가져오려면 아래 명령을 입력한다.
$ git fetch upstream
$ git checkout master
$ git merge upstream/master
fetch로 upstream 저장소의 내용을 가져와서 merge 명령으로 upstream 저장소의 master 브랜치 내용을 내 로컬 저장소에 병합한다. 이렇게 한 번씩 fetch와 merge를 해주면 로컬 저장소를 최신으로 유지할 수 있다.
많은 프로그래머들이 잘 쓰인 커밋 메시지가 더 유익하다는 사실에 동의한다. 그렇다면 좋은 커밋 메시지를 작성하기 위한 보편적인 기준은 무엇일까?
Git의 커밋 메시지는 제목과 본문 사이에 빈 줄을 추가하면 가독성이 향상된다. 이는 git log --oneline과 같은 명령어 사용 시 제목만 깔끔하게 보여준다.
제목을 50자 이내로 제한하면 간결하고 읽기 쉬운 커밋 메시지를 작성할 수 있다.
영문법에 따라 제목의 첫 글자를 대문자로 작성하면 전문적이고 깔끔한 인상을 준다.
제목에 마침표를 찍지 않는 것이 일반적인 관례다.
Git 자체가 자동 커밋 메시지를 생성할 때 명령문을 사용하므로, 이에 맞춰 제목을 명령문으로 작성하면 일관성을 유지할 수 있다.
Add new feature (O)Added new feature (X)Git은 자동으로 줄 바꿈을 하지 않으므로, 본문을 72자마다 줄 바꿈하여 가독성을 높인다.
본문에서는 변경사항이 무엇인지, 왜 했는지에 초점을 맞춰 설명한다.
커밋 메시지에 특정 키워드와 이슈 번호를 포함하면 GitHub에서 해당 이슈를 자동으로 닫아준다.
close, fix, resolve 등.Fix #123 - Correct calculation error
아래 repository를 위와 같이 Fork한다
~/Git/OPEN-SOURCE-CONTRIBUTION
$ git clone https://github.com/judemin/first-contributions.git
Cloning into 'first-contributions'...
remote: Enumerating objects: 98414, done.
remote: Counting objects: 100% (213/213), done.
remote: Compressing objects: 100% (81/81), done.
remote: Total 98414 (delta 140), reused 205 (delta 132), pack-reused 98201 (from 1)
Receiving objects: 100% (98414/98414), 47.79 MiB | 20.90 MiB/s, done.
Resolving deltas: 100% (62426/62426), done.
이후 fork한 repository를 clone한다
git checkout -b feat-feature
이후 feat-feature 라는 브랜치를 만들고, 해당 브랜치로 이동한다.
Contributors의 맨 첫줄이나 아랫줄을 제외한 아무 곳을 수정하고
git status
git add .
git commit -m "Add judemin to Contributors list"
위와 같이 커밋을 생성한다.
git push origin judemin
이후 Github에서 위와 같이 Pull Request 요청을 날리고
조금 기다리면 자동으로 upstream에 merge해주는 것을 볼 수 있다.
특수한 코드 한정자, 정규식, bool 연산자를 사용하여 수많은 Github의 프로젝트들 중에서 원하는 결과를 얻는 검색 쿼리를 작성할 수 있다.
검색 쿼리는 검색하려는 텍스트와 검색 범위를 좁히는 한정자로 구성된다.
sparse index는 sparse와 index를 모두 포함하는 문서를 찾아준다.공백을 포함한 정확한 문자열을 찾으려면 따옴표로 묶으면 된다.
"sparse index"는 정확히 이 문자열과 일치하는 결과를 찾아준다.한정자에서도 따옴표를 사용할 수 있다.
path:git language:"protocol buffers"" "를 검색하려면 백슬래시로 이스케이프해야 한다."name = \"tensorflow\""\를 검색하려면 이중 백슬래시 \\를 사용한다."C:\\Program Files"검색을 더 정확하게 하기 위해 부울 연산자를 사용할 수 있다.
AND: 기본적으로 공백은 AND로 처리된다. 모든 용어를 포함하는 결과를 찾아준다.OR: 둘 중 하나라도 포함하면 된다.sparse OR indexNOT: 특정 용어를 제외하고 검색할 수 있다."fatal error" NOT path:__testing__괄호 ()를 사용하여 복잡한 조건을 만들 수 있다.
(language:python OR language:ruby) AND NOT path:/tests/특수 키워드를 사용하여 검색 범위를 좁힐 수 있다.
repo:: 특정 리포지토리에서 검색한다.repo:octocat/Spoon-Knifeorg:: 특정 조직 내에서 검색한다.org:githubuser:: 특정 사용자 내에서 검색한다.user:octocatlanguage:: 특정 프로그래밍 언어로 검색한다.language:javascriptpath:: 특정 경로나 파일에서 검색한다.path:/src/*.jssymbol:: 함수나 클래스 같은 기호를 검색한다.symbol:initializecontent:: 파일의 콘텐츠만 검색한다.content:TODOis:: 리포지토리 속성으로 필터링한다.is:public, is:fork, is:archived슬래시 /로 감싸서 정규식을 사용할 수 있다.
/sparse.*index/는 sparse와 index 사이에 어떤 문자들이 와도 일치한다.path:/^App\/src\//검색어, 한정자, 부울 연산자 등은 공백으로 구분해야 한다.
(?-i)를 사용하면 된다./(?i)HTTP/는 대소문자 구분 없이 HTTP를 찾지만, /(?-i)HTTP/는 정확히 대문자 HTTP만 찾는다.
또한 여러 오픈소스 프로젝트 선택 도구를 살펴본 결과 CodeTriage가 현재 사용하고 있는 오픈소스 프로젝트들이 많이 포함되어 있고, 이슈를 가장 체계적으로 정리해주고 있어, 이를 활용해 Contribution을 시작할 계획이다.
References
https://github.com/firstcontributions/first-contributions
https://velog.io/@skynet/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EA%B8%B0%EC%97%AC-%EC%9E%85%EB%AC%B8
https://velog.io/@ppp3195/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%9E%85%EB%AC%B8%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%95%84%EC%A3%BC-%EA%B5%AC%EC%B2%B4%EC%A0%81%EC%9D%B8-%EA%B0%80%EC%9D%B4%EB%93%9C
https://docs.github.com/ko/search-github/github-code-search/understanding-github-code-search-syntax
https://seongjin.me/how-to-contribute-to-open-source/
https://seohyun0120.tistory.com/entry/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%9E%85%EB%AC%B8-%EB%88%84%EA%B5%AC%EB%82%98-%EB%94%B0%EB%9D%BC%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%BB%A8%ED%8A%B8%EB%A6%AC%EB%B7%B0%ED%84%B0-%EB%90%98%EA%B8%B0
https://github.com/firstcontributions/first-contributions
https://meetup.nhncloud.com/posts/106