---
description: 오픈소스 project를 잘 분석할 수 있는 Reading Skill
---

# 개발자가 오픈소스를 읽는 방법



> [2021 오픈소스 컨트리뷰션 아카데미](https://contributionacademy.oopy.io)의 오픈소스 101 교육을 듣고 정리한 내용입니다.

#### 1. 해당 오픈소스에서 누가 제일 개발을 많이 할까?

> 오픈소스 프로젝트에서 Git은 단순한 프로젝트 버전관리 도구가 아니다. 협업의 관점에서 오픈소스를 해석하고 관리할 줄 알아야 한다.

```
git shortlog -sn | nl

     1      77  Soumith Chintala
     2      63  Bryan Marcus McCann
     3      34  Adam Lerer
     4      23  soumith
     5      20  Rohan Varma
     ...
```

* `nl` 명령은 파일의 line number 명시

```
git shortlog -sn -- mnist/ | nl
```

* ( 예제 코드에서는 `-- mnist` 폴더 )특정 폴더, 파일을 기준으로 기여 내역을 확인할 수 있다.
* 보통 오픈소스 개발을 할 때는 특정 파트에 집중하기 때문에, 폴더 별로 기여자 혹은 기여 내용을 확인할 줄 알아야한다.
* 즉, 프로젝트의 owner 보다, 내가 수정하고 싶은 부분의 가장 큰 기여자에게 도움을 요청하는 것이 더 좋을 수 있다.&#x20;
  * 오너는 바쁨...

#### 2. 전체 소스파일 수정내역(commit) 확인

```
git log --oneline

a50b91b PR test
976a903 Merge pull request #294 from gentlelinuxer/fix-mnist
08f6dd5 PR test
92df8fc Merge pull request #263 from gentlelinuxer/test
f1a28b1 PR test
943af71 Merge pull request #136 from gentlelinuxer/master
...
```

* `wc -l` 명령은 (파일) 라인수 개수를 측정한다.&#x20;
  * 총 commit 개수를 확인할 때 사용&#x20;

#### 3. 특정 commit의 자세한 내용 확인

```
git show 6c8e2ba
```

* **commit ID 란?**
  * `6c8e2ba` 가 commit의 아이디이다.
* author, date, commit message, diff 내역 등을 확인할 수 있다.
* **이 commit 에서는 몇 개의 파일을 수정했을까?**&#x20;
  * `grep "diff"` 로 어떤 파일들을 확인했는지 잡아서 확인할 수 있다.&#x20;

#### 4. 특정 소스파일 기준 commit 리스트 확인

```
git log --oneline -- mnist/
```

* `-- 폴더/, 파일`&#x20;
* `shortlog`, `--no-merges` 등 옵션들과 섞어서 사용해보자.

#### 5. 특정 날짜 기준 commit 리스트 확인

```
git log --oneline --after=2020-01-01 --before=2020-06-30
```

* `wc -l` 옵션을 활용하면?&#x20;
* 특정 기간의 커밋 리스트와 그 개수를 확인할 수 있으면 프로젝트 진행결과를 해석하고 통계 내기 용이함.

#### 6. Merge commit 이란?

* 다른 기여자의 커밋이 master에 병합되었음을 알려주는 커밋.
* 머지 커밋에서는 **소스의 수정내역은 없음**을 확인하자.
* `--no-merges` 옵션을 추가하면 머지커밋을 제외하고 커밋 내역을 확인할 수 있다.

#### 7. 과거순으로 소스파일 commit 내역 확인

> 최초 커밋을 알고 싶다면?

```
git log --reverse | head -1
```

* reverse 옵션은 역순으로 commit log를 정렬해준다.
