git으로 특정 기능이 언제 도입되었는지 찾기

답: 커뮤니티에 물어보거나 릴리즈 노트를 검색하면 된다.

하지만 다른 방법을 원한다면 다음을 읽도록 하자.

기술적인 문제에 대한 글을 쓰다 보면, 오픈소스 프로젝트에서 특정 기능이 언제 도입된 것인지 정확하게 알아야 할 때가 있다. 예를 들어, 내가 만든 소프트웨어가 운영 체제의 특정 기능 때문에 동작하지 않게 되었다면, 그 기능이 어떤 버전에 들어있는지 확인해서 고객들에게 그 버전은 사용하지 말라고 말해줘야 할 것이다.

예를 통해 한번 알아보자.

저번 포스팅에서 언급했듯이 git-add에는 –edit 라는 좋은 옵션이 있다. 하지만 모든 사람이 최신버전의 git을 사용하는 것은 아닐테니, 이 옵션을 쓸 수 없는 사람들도 있을 것이다. 어떤 버전부터 사용이 가능한지 알아보자.

일단 이 기능이 저장소에 정확히 언제 커밋되었는지 찾아봐야한다. 커밋로그를 잘 작성하는 문화가 정착된 프로젝트라면, 대개 첫 줄에 간단한 요약을 적을 것이므로 다음과 같이 각 커밋로그의 첫 줄을 검색해서 어렵지 않게 찾아낼 수 있다. (( Git에서 권하는 커밋로그 컨벤션은, 첫 줄에 50자 이내의 요약을 적고 빈 줄을 하나 삽입한 뒤 그 뒤부터 자세한 설명을(보통 한줄당 72자로) 적는 것이다. man git-commit 해서 DISCUSSION 절을 보라. ))

$ git log --oneline | grep '--edit'
8580830 "git pull" doesn't know "--edit"
2ff14e3 completion: --edit and --no-edit for git-merge
c2d17ba branch --edit-description: protect against mistyped branch name
aad0709 completion: --edit and --no-edit for git-merge
48c07d8 completion: --edit-description option for git-branch
66f4b98 Teach merge the '[-e|--edit]' option
b7200e8 branch: teach --edit-description option
c59cb03 git-add: introduce --edit (to edit the diff vs. the index)
ec9d00d git-svn: fix commit --edit flag when using SVN:: libraries
b788498 git-revert: make --edit default.

밑에서 세 번째 커밋을 보면 로그에 ‘introduce –edit’ 이라고 되어있다. 이게 맞는 것 같다. git show c59cb03로 패치를 들여다보니 확실하다. (( 만약 커밋로그를 엉성하게 적는 프로젝트를 만났다면 이 단계에서 큰 난관에 봉착하게 된다. 커밋로그에 그냥 점 하나만 찍어놓는 개발자들도 얼마든지 있다. 첫 줄에 요약을 적는 관습을 따르지 않는 정도라면야 git log --grep 으로 모든 로그 메시지를 검색해도 되겠지만, 그게 아니라 아예 커밋로그를 안 쓰는 수준이라면 고생을 피할 수 없다. git log -S로 특정 변수, 상수, 함수, 클래스, 모듈 이름 등을 검색해서라도 알아낼 수 밖에 없다. 그러니 누군가가 당신의 코드저장소를 검색하는 상황을 고려해서 부디 커밋로그를 잘 적길 바란다. ))

그럼 이 기능이 어떤 버전에 들어갔는지 확인해보자. 릴리즈한 커밋에 대해서는 태그를 붙여두는 것이 일반적이므로, git tag --contains로 특정 커밋을 포함한 태그를 찾을 수 있을 것이다.

$ git tag --contains=c59cb03
v1.6.4
v1.6.4-rc0
v1.6.4-rc1
v1.6.4-rc2
v1.6.4-rc3
...

이 커밋이 포함된 가장 앞선 버전은 v1.6.4다. 이것으로 미루어보아 git-add의 –edit 옵션은 버전 v1.6.4에서 추가되었음을 알 수 있다.

하지만 아직 좀 미심쩍다. 우린 아직 v1.6.4에 –edit 옵션이 들어갔다는 공신력있는 언급을 보지 못했다. 릴리즈 노트를 들여다보면 확신을 얻을 수 있을 것 같다.

보통 특정 버전의 태그가 붙은 커밋에서, 릴리즈 노트를 편집하는 작업을 많이 한다. 그걸 보면 릴리즈 노트가 어디 있는지 정확히 알 수 있을 것이다. v1.6.4 태그가 붙은 커밋을 살펴보자.

$ git show v1.6.4
...
--- a/Documentation/RelNotes-1.6.4.txt
+++ b/Documentation/RelNotes-1.6.4.txt
@@ -67,6 +67,12 @@ Updates since v1.6.3

  * "git cvsexportcommit" learned -k option to stop CVS keywords expansion

  + * "git fast-export" learned to handle history simplification more
  +   gracefully.
...

Documentation/RelNotes-1.6.4.txt 파일이 이 커밋에서 수정되었다. 이름으로 보나 뭘로 보나 릴리즈 노트임을 짐작할 수 있다. 근데 cat Documentation/RelNotes-1.6.4.txt 해보면 그 파일이 없다. 아마 이후에 옮겨진 모양이다. 그렇다고 어디갔는지 굳이 찾을 필요는 없다. v1.6.4 시점에서의 그 릴리즈 노트를 열어서 우리가 원하는 것을 찾아보면 된다.

$ git show v1.6.4:Documentation/RelNotes-1.6.4.txt
...
(usability, bells and whistles)

* "git add --edit" lets users edit the whole patch text to fine-tune what
is added to the index.
...

릴리즈 노트에서도 확인했다. 이제 git-add에 –edit 옵션이 처음 도입된 버전이 v1.6.4 라는 것은 확신할 수 있을 것이다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중