자바스크립트를 활성화 해주세요

git patch 내역 메일 전송 방법 (git send-email)

 ·  ☕ 11 min read

최근 오픈소스 프로젝트의 경우 git 호스팅 서비스인 github, gitlab, bitbucket 등에서 관리되고 있을 것이다. 해당 사이트들은 웹 브라우저에서 손쉽게 코드 기여를 할 수 있다. (github의 Pull Request, gitlab의 Merge Request, bitbucket의 Pull request 참고) 물론 위 호스팅 서비스 외 다른 서비스도 비슷한 방식으로 관리될 가능성이 높다.

하지만 리눅스 커널을 비롯한 일부 오픈소스들은 메일을 통해 수정 사항을 보내고 리뷰한다. 이 문서에서는 리눅스 커널 위주로 설명할 예정이다. 리눅스 커널에 기여하기 위해서는 commit 작성 방법부터 여러 단계가 있지만, 이 글에서는 메일로 patch(git commit을 파일 단위로 변환)를 보내는 방법 중 하나인 git send-email의 사용법을 설명하도록 하겠다.

메일 전송 도구

공식 문서에서는 유명한 이메일 클라이언트 목록과, patch 전송에 필요한 설정법을 설명하고 있다. 문서를 읽어보면 어떤 프로그램은 쓰지 말고 도망쳐 같은 비추천이 있는가 하면, 대부분 프로그램의 경우 조금만 설정하면 잘 쓸수 있다고 하고 있다.

이 중 아마도 가장 인기있는 것은 mutt와 이번에 알아볼 git send-email일 것이다. 커널 개발 환경이 사실상 CLI라서 유난히 더 인기가 있는지도 모르겠다.

mutt의 사용법이 궁금하다면 설정 방법메일 전송 방법 글을 참고하자. ("디버깅을 통해 배우는 리눅스 커널의 구조와 원리" 저자 분의 블로그며, 이 내용은 해당 책의 부록에도 실려있다.)

Gmail 사용자를 위한 추가 설정

만약 본인이 Gmail 계정으로 patch를 전송하려 하면 메일 전송 과정에서 오류가 발생할 것이다. Google의 보안 강화로 인해 직접 계정 비밀번호를 통해 인증하는 것이 아니라 앱 비밀번호를 이용해 인증해야 하는데, 여기서 미리 준비해두자.

본인 계정이 영어로 설정되어 한국어 번역이 일치하지 않을 수도 있으나, 주요 페이지에 대한 링크를 걸어놓고, 스크린샷을 첨부했으니 참고하여 따라하면 될 것 같다.

2단계 인증 사용

먼저 앱 비밀번호를 만들려면 2단계 인증을 사용해야한다.

구글 계정의 보안 메뉴에서(아래 그림 ①) 2단계 인증을 활성화하자. 아래 그림과 같이 2단계 인증을 사용 중인 상태로 만들면 된다. (아래 그림 ②의 2단계 인증 메뉴를 눌러서 시키는대로 따라 하면 된다.)

스크린샷은 영어로 되어있지만, 한글 메뉴도 별반 다르지 않을 것이다.

앱 비밀번호 만들기

이전 2단계 인증 메뉴 바로 아래에 앱 비밀번호(위 그림 ③)를 누르면 앱 비밀번호를 관리하는 페이지가 나온다. 앱 종류에서(아래 그림 ①) 메일을 선택하고, 장치 종류에서 기타 (사용자 지정) 을(아래 그림 ②) 선택하면 기존 선택하던 자리가 이름을 입력하는 칸으로 변경된다. git send-email 등의 이름으로 입력하고 옆의 생성하기(아래 그림 ③) 버튼을 누르자.

스크린샷에는 나와있지 않지만 ①, ② 자리가 이름을 입력하는 공간으로 바뀐다.

위와 같이 실행했다면 아래와 같은 화면에 16자 글자가 나올 것이다. (아래 스크린샷은 보안을 위해 생성된 비밀번호를 모자이크 처리했다.) 해당 비밀번호를 임시 텍스트 파일 등에 보관해두자. (메일 전송 시 계정 비밀번호 대신 사용하게 된다. 추가 설정을 통해 자동으로 저장되므로 평생 보관할 필요는 없다.)

4글자 단위로 16글자의 비밀번호가 생성된다.

git send-email 설치 및 설정

먼저 git send-email을 설치하자. (git은 이미 설치되어있다 가정한다.)

$ sudo apt install git-email
$ sudo dnf install git-email
$ sudo yum install git-email
# Arch 계열은 git 패키지 내 git send-email이 포함되어있다.
$ sudo pacman -Syu --needed git perl-authen-sasl perl-io-socket-ssl

이후 메일 전송 및 인증과 관련된 Perl script 의존성들을 설치한다. (리눅스 커널을 빌드하려면 간접적으로 Perl을 설치했을 것이다. 아래 cpan 명령어가 실행 가능한지 확인해보고 설치하자.)

$ cpan Authen::SASL MIME::Base64 Net::SMTP::SSL

이제 메일 계정과 관련된 정보를 git에 설정해주자. git config --edit 명령으로 설정 파일을 열어서 수정하면 된다. 참고로 git config --edit --global 명령으로 ~/.gitconfig 파일(현재 유저의 전역 설정) 수정이 가능하다. ("<>“로 된 부분에는 본인의 설정을 넣으면 된다.)

다른 참고 링크의 경우 현재 유저의 전역 설정을 변경하라고 하지만, 현재 레포지터리의 설정만 수정해도 문제없다. (나의 경우, 특정 레포에 따라 계정 정보를 다르게 사용한 경험이 있어, 이렇게 처리한다.)

[user]
    # commit 작성 시 이미 제대로 설정했을 것이다.
    name = <이름 (본명 사용)>
    email = <본인 이메일 주소>
[sendemail]
    smtpServer = <사용할 이메일의 SMTP 주소>
    smtpServerPort = <사용할 이메일의 SMTP 포트>
    smtpEncryption = <사용할 이메일의 SMTP 주소>
    smtpUser = <사용할 이메일 주소>
[credential]
    helper = store
[user]
    name = JaeSang Yoo
    email = jsyoo5b@gmail.com
[sendemail]
    smtpServer = smtp.gmail.com
    smtpServerPort = 587
    smtpEncryption = tls
    smtpUser = jsyoo5b@gmail.com
[credential]
    helper = store

[user] 부분은 이미 설정했을 것이니 설명은 생략하도록 하겠다.
[sendemail]의 항목들은 SMTP로 메일을 보내기 위한 설정을 하는 것이다.
[credential]에서 helper = store로 설정하는 것은, 자격증명(비밀번호 등을 통한 계정 인증) 내역을 개별 파일에(기본 경로: ~/.git-credentials) 저장하여 매번 메일 전송에 대한 자격증명을 요구하지 않고 재활용하게 하는 것이다.

메일 보내기

실제 메일을 전송하기 전에, 메일 전송이 정상적으로 수행되는지 나에게 메일 보내기를 해보자. (일단 아래 명령어 예시에서는 내 메일 주소, 내가 작성했던 patch를 사용했다.) 먼저 --dry-run 인자를 입력하여 메일을 보낼 대상이 잘 설정되는지 확인해보고 실제로 전송해보자. 받을 메일 주소는 --to $메일_주소를, 참조할 메일 주소는 --cc $메일_주소 인자로 넣으면 된다. (상대 이름을 포함해서 메일주소를 전달하고 싶다면 --to "$이름 <$메일_주소>" 형태로 입력하면 된다.)

$ git send-email --to "JaeSang Yoo <jsyoo5b@gmail.com>" --dry-run 0001-mm-slub-remove-unused-parameter-in-setup_object.patch
0001-mm-slub-remove-unused-parameter-in-setup_object.patch
(mbox) Adding cc: JaeSang Yoo <jsyoo5b@gmail.com> from line 'From: JaeSang Yoo <jsyoo5b@gmail.com>'
(body) Adding cc: JaeSang Yoo <jsyoo5b@gmail.com> from line 'Signed-off-by: JaeSang Yoo <jsyoo5b@gmail.com>'
Dry-OK. Log says:
Server: smtp.gmail.com
MAIL FROM:<jsyoo5b@gmail.com>
RCPT TO:<jsyoo5b@gmail.com>
From: JaeSang Yoo <jsyoo5b@gmail.com>
To: jsyoo5b@gmail.com
Subject: [PATCH] mm/slub: remove unused parameter in setup_object*()
Date: Mon, 11 Apr 2022 21:39:56 +0900
Message-Id: <20220411123956.3493712-1-jsyoo5b@gmail.com>
X-Mailer: git-send-email 2.25.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Result: OK
$ git send-email --to "JaeSang Yoo <jsyoo5b@gmail.com>" 0001-mm-slub-remove-unused-parameter-in-setup_object.patch
0001-mm-slub-remove-unused-parameter-in-setup_object.patch
(mbox) Adding cc: JaeSang Yoo <jsyoo5b@gmail.com> from line 'From: JaeSang Yoo <jsyoo5b@gmail.com>'
(body) Adding cc: JaeSang Yoo <jsyoo5b@gmail.com> from line 'Signed-off-by: JaeSang Yoo <jsyoo5b@gmail.com>'

From: JaeSang Yoo <jsyoo5b@gmail.com>
To: jsyoo5b@gmail.com
Subject: [PATCH] mm/slub: remove unused parameter in setup_object*()
Date: Mon, 11 Apr 2022 21:44:17 +0900
Message-Id: <20220411124417.3496483-1-jsyoo5b@gmail.com>
X-Mailer: git-send-email 2.25.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

    The Cc list above has been expanded by additional
    addresses found in the patch commit message. By default
    send-email prompts before sending whenever this occurs.
    This behavior is controlled by the sendemail.confirm
    configuration setting.

    For additional information, run 'git send-email --help'.
    To retain the current behavior, but squelch this message,
    run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): y
OK. Log says:'smtp://jsyoo5b@gmail.com@smtp.gmail.com:587':
Server: smtp.gmail.com
MAIL FROM:<jsyoo5b@gmail.com>
RCPT TO:<jsyoo5b@gmail.com>
From: JaeSang Yoo <jsyoo5b@gmail.com>
To: jsyoo5b@gmail.com
Subject: [PATCH] mm/slub: remove unused parameter in setup_object*()
Date: Mon, 11 Apr 2022 21:44:17 +0900
Message-Id: <20220411124417.3496483-1-jsyoo5b@gmail.com>
X-Mailer: git-send-email 2.25.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Result: 250

dry-run 부분을 보면 기본적으로 나 자신(내 메일 주소)를 참조하는 것을 볼 수 있다. 또한 patch 안에 Signed-off-by:에 내 메일 주소가 있기 때문에 자동으로 참조를 시도한다. 물론 현재 명령어에서 받을 메일 주소로 나 자신을 설정했기 때문에 참조 설정은 자동으로 무시되었다. (인자로 입력하지 않아도 나 자신이 참조되는 부분은 아래에서 다시 보여주도록 하겠다.)

실제 메일 전송을 시도하면 Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): 와 같이 보내기 전에 확인한다. y를 입력하면 실제 메일 전송을 시도한다. 만약 처음 메일을 보내려 한다면, 실질적인 자격증명(계정 비밀번호 확인)을 위해 비밀번호 등을 물어본다. 계정의 비밀번호를 입력하면 된다. 이번 자격증명 이후로는 아까 [credential] 설정 덕분에 비밀번호 정보가 저장되므로, 앞으로 메일 보낼 때는 비밀번호를 물어보지 않을 것이다.

Gmail 사용자는 실제 본인 계정의 비밀번호가 아니라, 이전에 준비한 16자리의 앱 비밀번호를 입력하면 된다.

자격증명에 성공했다면 최종적으로 Result: 250과 같이 메일 전송 결과가 나타난다. 본인 메일함에 patch가 잘 들어왔는지 확인해보자.

실제 patch 전송하기 (리눅스 커널)

메일을 통해 수정 사항을 보내고 리뷰하는 다른 프로젝트라면 위의 메일 보내는 부분까지만 봐도 충분하다. 아래 부분은 리눅스 커널 기여 과정에서 생길 상황을 설명한다.

commit을 작성하고, patch로 변환한 내역을 메일로 보내려면 누구한테 메일을 보낼 지 알아내야 한다. 리눅스 커널의 경우 현재 patch에 따라 누구에게 보내야 하는지 확인해주는 스크립트가 제공된다. (현재 작성한 patch가 규정을 만족하는지에 대한 스크립트도 제공되지만, 이 부분에 대한 설명은 생략하도록 하겠다.)

아래 코드는 slub 코드를 수정했던 패치를 전달하는 경우의 예시다.

$ ./scripts/get_maintainer.pl 000l-mm-slub-remove-unused-parameter-in-setup_object.patch
Christoph Lameter <cl@linux.com> (maintainer:SLAB ALLOCATOR)
Pekka Enberg <penberg@kernel.org> (maintainer:SLAB ALLOCATOR)
David Rientjes <rientjes@google.com> (maintainer:SLAB ALLOCATOR)
Joonsoo Kim <iamjoonsoo.kim@lge.com> (maintainer:SLAB ALLOCATOR)
Andrew Morton <akpm@linux-foundation.org> (maintainer:SLAB ALLOCATOR)
Vlastimil Babka <vbabka@suse.cz> (maintainer:SLAB ALLOCATOR)
Roman Gushchin <roman.gushchin@linux.dev> (reviewer:SLAB ALLOCATOR)
linux-mm@kvack.org (open list:SLAB ALLOCATOR)
linux-kernel@vger.kernel.org (open list)

이제 이 patch를 위 메일 주소에 모두 전송해야된다. 일반적으로 maintainerreviewer의 경우 --to의 대상이며, linux-mm@kvack.org같은 메일링 리스트(open list)는 --cc로 참조하는 것이 일반적인 규정이다. 하지만 이 메일 주소들을 모두 복사해서 인자로 넣기 귀찮을 것이다. git send-email의 경우 이 목록을 좀 더 쉽게 입력할 방법을 제공한다. 아까와 같이 git 설정에 아래 부분을 추가해주자.

[sendemail]
    # 이전 SMTP 설정 아래에 추가하면 된다.
    tocmd ="`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol"
    cccmd ="`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nom"

이전에 메일 전송 대상을 확인해주던 ./scripts/get_maintainer.pl의 경우 여러 인자를 통해 결과를 변경할 수 있다. --norolestat 인자를 통해 각 메일 주소의 maintainer, reviewer, open list 부분을 제외하고 출력시킬 수 있다. --nogit--nogit-fallback 부분은 해당 스크립트의 도움말에서 --git, --git-fallback 설정을 끄는 것이니, 해당 도움말을 참고하기 바란다.

tocmdcccmd가 다른 점은 마지막에 --nol, --nom이 각각 다른데, --nol은 메일링 리스트를 제외할것, --nom은 메인테이너를 제외하라는 명령이다.

이제 메일 전송 대상은 자동으로 입력될테니 실제 메일을 전송해보자. (물론 먼저 --dry-run으로 잘 되는지 확인부터 하자.)

$ git send-email 0001-mm-slub-remove-unused-parameter-in-setup_object.patch
0001-mm-slub-remove-unused-parameter-in-setup_object.patch
(mbox) Adding cc: JaeSang Yoo <jsyoo5b@gmail.com> from line 'From: JaeSang Yoo <jsyoo5b@gmail.com>'
(body) Adding cc: JaeSang Yoo <jsyoo5b@gmail.com> from line 'Signed-off-by: JaeSang Yoo <jsyoo5b@gmail.com>'
(to-cmd) Adding to: Christoph Lameter <cl@linux.com> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(to-cmd) Adding to: Pekka Enberg <penberg@kernel.org> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(to-cmd) Adding to: David Rientjes <rientjes@google.com> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(to-cmd) Adding to: Joonsoo Kim <iamjoonsoo.kim@lge.com> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(to-cmd) Adding to: Andrew Morton <akpm@linux-foundation.org> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(to-cmd) Adding to: Vlastimil Babka <vbabka@suse.cz> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(to-cmd) Adding to: Roman Gushchin <roman.gushchin@linux.dev> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol'
(cc-cmd) Adding cc: Roman Gushchin <roman.gushchin@linux.dev> from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nom'
(cc-cmd) Adding cc: linux-mm@kvack.org from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nom'
(cc-cmd) Adding cc: linux-kernel@vger.kernel.org from: '`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nom'

From: JaeSang Yoo <jsyoo5b@gmail.com>
To: Christoph Lameter <cl@linux.com>,
        Pekka Enberg <penberg@kernel.org>,
        David Rientjes <rientjes@google.com>,
        Joonsoo Kim <iamjoonsoo.kim@lge.com>,
        Andrew Morton <akpm@linux-foundation.org>,
        Vlastimil Babka <vbabka@suse.cz>,
        Roman Gushchin <roman.gushchin@linux.dev>
Cc: JaeSang Yoo <jsyoo5b@gmail.com>,
        linux-mm@kvack.org,
        linux-kernel@vger.kernel.org
Subject: [PATCH] mm/slub: remove unused parameter in setup_object*()
Date: Mon, 11 Apr 2022 16:25:34 +0900
Message-Id: <20220411072534.3372768-1-jsyoo5b@gmail.com>
X-Mailer: git-send-email 2.25.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

    The Cc list above has been expanded by additional
    addresses found in the patch commit message. By default
    send-email prompts before sending whenever this occurs.
    This behavior is controlled by the sendemail.confirm
    configuration setting.

    For additional information, run 'git send-email --help'.
    To retain the current behavior, but squelch this message,
    run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): y
OK. Log says:
Server: smtp.gmail.com
MAIL FROM:<jsyoo5b@gmail.com>
RCPT TO:<cl@linux.com>
RCPT TO:<penberg@kernel.org>
RCPT TO:<rientjes@google.com>
RCPT TO:<iamjoonsoo.kim@lge.com>
RCPT TO:<akpm@linux-foundation.org>
RCPT TO:<vbabka@suse.cz>
RCPT TO:<roman.gushchin@linux.dev>
RCPT TO:<jsyoo5b@gmail.com>
RCPT TO:<linux-mm@kvack.org>
RCPT TO:<linux-kernel@vger.kernel.org>
From: JaeSang Yoo <jsyoo5b@gmail.com>
To: Christoph Lameter <cl@linux.com>,
        Pekka Enberg <penberg@kernel.org>,
        David Rientjes <rientjes@google.com>,
        Joonsoo Kim <iamjoonsoo.kim@lge.com>,
        Andrew Morton <akpm@linux-foundation.org>,
        Vlastimil Babka <vbabka@suse.cz>,
        Roman Gushchin <roman.gushchin@linux.dev>
Cc: JaeSang Yoo <jsyoo5b@gmail.com>,
        linux-mm@kvack.org,
        linux-kernel@vger.kernel.org
Subject: [PATCH] mm/slub: remove unused parameter in setup_object*()
Date: Mon, 11 Apr 2022 16:25:34 +0900
Message-Id: <20220411072534.3372768-1-jsyoo5b@gmail.com>
X-Mailer: git-send-email 2.25.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Result: 250

위 결과는 이전에 patch를 보낼때 나온 기록을 재활용했다.

이전에 tocmd, cccmd를 설정한대로, maintainer들은 To:에, open list들은 Cc:에 추가되었다. 중간에 reviewer--nom, --nol에도 필터링 되지 않았기 때문에 (필터링을 하려면 --nor을 인자로 넣어야 한다.) To:Cc:에 모두 추가되었지만 중복되므로 To:에만 남아있는 것을 볼 수 있다.

또한 이전에 나에게 메일 보낼 때 확인했던 것과 같이 자동으로 내 메일 주소를 참조하도록 설정되었다.

수정 버전 전송하기

전송한 patch가 명백하고 간단하다면 바로 승인되겠지만, 개선사항 등이 존재한다면 리뷰 메일이 올 것이고, 새로 수정한 버전을 전송해야한다. 이전처럼 commit을 다시 작성하고 patch로 만든 다음 해당 patch 파일에 일부 내용을 수정해야한다.

  1. 제목에 [PATCH][PATCH v2]처럼 개선 횟수마다 버전을 올려야 한다.
  2. 이전에 비해 어떤 점이 변경되었는지 설명이 필요하다면 언급해도 된다.

특히 2번의 경우 사소한 이야기나 변경 내역을 commit log에 남게 하지 않으려면 아래처럼 작성하면 된다.

Subject: [PATCH v3] trace: param: fix tp_printk option related with tp_printk_stop_on_boot

Kernel param "tp_printk_stop_on_boot" starts with "tp_printk" which is
the exact as the other kernel param "tp_printk".
In compile & build process, It may not guaranteed that
"tp_printk_stop_on_boot" always checked before "tp_printk".
(By swapping its __setup() macro order, it may not work as expected.)
Some kernel params which starts with other kernel params consider this
problem. See commit 745a600cf1a6 ("um: console: Ignore console= option")
or init/do_mounts.c:45 (setup function of "ro" kernel param)

Kernel param "tp_printk" can be handled with its value(0 or off) or
it can be handled without its value. (maybe it won't effect anything)
Fix setup function to ignore when the "tp_printk" becomes prefix of
other kernel param.

Signed-off-by: JaeSang Yoo <jsyoo5b@gmail.com>
---
from v2, I thought the changes were obvious that I didn't even tried to
check whether it has obvious typo. Sorry about that.

 kernel/trace/trace.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index c860f582b078..48f34ab29db2 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -252,6 +252,9 @@ __setup("trace_clock=", set_trace_boot_clock);
 
 static int __init set_tracepoint_printk(char *str)
 {
+	/* Ignore the "tp_printk_stop_on_boot" param */
+	if (*str == '_')
+		return 0;
 	if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0))
 		tracepoint_printk = 1;
 	return 1;
-- 
2.25.1

참고로 위 patch는 v2에서 너무 신난 나머지 return 0;조차 안 붙여서 혼난 것에 대한 수정 patch다. 물론 v2 리뷰에서 주석도 추가하라고 해서 같이 수정한 상태다.

보통 commit log와 실제 코드 변경분 사이에 ---으로 구분을 하는데, 이 바로 아래에 patch에 대한 주석을 달아도 된다. 공식 문서에도 해당 부분이 언급되어있다.

추후 추가사항

아쉽게도 지금까지 패치 내역은 1개의 commit 단위라서 메일을 1개씩만 보냈지만, 작업을 하다보면 commit을 여러 개로 분리하여 한번에 patch set 등으로 보내기도 한다.

만약 전송할 패치가 3개라면 순서대로 [PATCH 1/3], [PATCH 2/3], [PATCH 3/3]과 같이 여러 patch set임을 제목에서 알려주게 된다. 그리고 해당 patch set에 대한 소개를 [PATCH 0/3]과 같이 제일 앞에 커버 레터처럼 전송하기도 한다. 아쉽게도 이 부분에 대한 경험이 없는데, 추후 경험해본다면 작성해 보도록 하겠다.

참고 링크

[1] 리눅스에 패치 업로드 하기
[2] Gmail 사용 시 git send-email 설정 방법
[3] 메일 전송 대상 자동 추가하는 방법


JaeSang Yoo
글쓴이
JaeSang Yoo
The Programmer

목차